2010-10-08 18 views
1

pourquoi cela fonctionne:R: Pourquoi cela ne fonctionne pas ?, matrice, erreur d'arrondi?

ncota <- 1 
nslope <- 29 
resul <- matrix(rep(0,ncota*nslope*4),ncota*nslope,4) 

Mais cela ne fonctionne pas?

ncota <- 1 
sini <- 0.1; sfin <- 1.5; spaso <- 0.05; nslope <- 1+((sfin-sini)/spaso) 
resul <- matrix(rep(0,ncota*nslope*4),ncota*nslope,4) 

Je suppose que le problème est que la division donne un nombre non entier. Comment puis-je obtenir le deuxième travail? Je dois créer une matrice zéro avec sa taille calculée à partir d'un calcul d'équation.

acclamations

+0

@Juan: il est impoli de traverser plusieurs postes (c.-à-d. stackoverflow et R-help). –

+0

Salut. Je pensais qu'ils étaient différents sites. J'ai demandé sur les deux parce que je ne savais pas qui va répondre et où. – skan

Répondre

5

Si tout ce que vous devez faire est de créer une matrice de zéros, vous n'avez pas besoin de fournir le nombre exact de zéros, juste fournir une et de R recycler à la longueur requise :

matrix(0, ncota*nslope, 4) 

la raison pour laquelle la seconde échoue est que ncota * nslope * 4 est pas exactement 116:

> (ncota * nslope * 4) == 116 
[1] FALSE 
> all.equal(ncota * nslope * 4, 116) 
[1] TRUE 

all.equal montre que ceux-ci sont égaux si vous autorisez l'erreur de virgule flottante.

?rep comprend les éléments suivants:

Non-integer values of ‘times’ will be truncated towards zero. If 
‘times’ is a computed quantity it is prudent to add a small fuzz. 

et si nous faisons comme il dit et d'ajouter une petite fuzz, rep ne donne le nombre désiré de 0s:

> length(rep(0, times = ncota*nslope*4 + 0.00000001)) 
[1] 116 

Comme l'a noté Hadley (dans les commentaires), ce fuzz peut être facilement ajouté en utilisant la fonction zapsmall:

> length(rep(0, times = zapsmall(ncota*nslope*4))) 
[1] 116 
+0

Réponse impressionnante; très complet! –

+2

Une autre fonction utile dans cette circonstance est 'zapsmall' – hadley

+0

Merci Hadley, avait oublié cette fonction. J'ai ajouté une note sur ceci à ma réponse. –

1

Vous n'avez pas besoin d'utiliser rep. Cela fonctionne très bien:

resul <- matrix(0,ncota*nslope,4)