Je me demandais s'il est possible d'utiliser la fonction lapply() pour modifier la valeur de l'entrée, semblable à:Pouvez-vous utiliser la fonction lapply() pour modifier la valeur de l'entrée?
a1<-runif(100)
a2<-function(i){
a1[i]<-a1[i-1]*a1[i];a1[i]
}
a3<-lapply(2:100,a2)
Je cherche quelque chose qui ressemble à une boucle for(), mais en utilisant l'infrastructure lapply(). Je n'ai pas pu obtenir rapply() pour le faire.
La raison en est que la fonction «réelle» a2 est une fonction difficile qui n'a besoin d'être évaluée que si la valeur de a1 [i-1] répond à certains critères.
re-phrasé: donc je suis en train de remplacer le for() dans le code ci-dessous par un lapply() - Type chose:
a1<-runif(100)
a2<-function(i, a1){
a1[i]<-a1[i-1]*2
a1[i]
}
a3<-as.numeric(lapply(2:100, a2, a1=a1))
#compare the output of a3 with that of a1 after the recursive loop
a2<-a1 #saved for comparison
for(i in 2:length(a1)){
a1[i]<-a1[i-1]*2
}
cbind(a1[2:100],a3)
#actually this is would be like writting a lapply() version of the cumprod() function
cbind(a1,cumprod(a2))
La R liste de diffusion a conseillé à la recherche jusqu'à la réduire () fonction .... comme dans:
a1<-runif(100)
cadd<-function(x) Reduce("*", x, accumulate = TRUE)
cadd(a1)
qui donne le même résultat que cumprod (a1) ... mais il est encore plus lent que la boucle:
a1<-runif(100000)
cadd<-function(x) Reduce("*", x, accumulate = TRUE)
looop<-function(a1){
j<-length(a1)
for(i in 2:j){
a1[i]<-a1[i-1]*a1[i]
}
a1
}
> system.time(cadd(a1))
user system elapsed
1.344 0.004 1.353
> system.time(cumprod(a1))
user system elapsed
0.004 0.000 0.002
> system.time(loop(a1))
user system elapsed
0.772 0.000 0.775
>
Une idée?
Je ne pense pas que je suis ce que vous voulez faire. Est-ce que a1 [i] (ce que vous calculez) dépend de a1 [i-1]? Si c'est le cas, je pense qu'il est préférable d'utiliser des boucles. Si ce n'est pas le cas, il serait préférable de subdiviser le vecteur et de faire la fonction dans cette partie. –
Est-ce que ceux-ci devraient être équivalents dans votre dernière ligne ci-dessus: cbind (a1, cumprod (a2))? Pour autant que je sache, ils ne correspondent pas. – Shane
Shane: c'est le problème: la fonction looop() (voir article) donne le même résultat que cumprod .... mais pas la version lapply(). Je veux récursivement appliquer une fonction (plus compliquée que la multiplication) qui utilise la valeur de l'évaluation précédente sur un vecteur ...et ne peut pas trouver un moyen d'éviter la boucle – user189035