Können Sie die lapply () Funktion den Wert des Eingangs zu verändern?
Frage
Ich habe mich gefragt, ob es möglich ist, die lapply () Funktion zu verwenden, um den Wert des Eingangs zu verändern, ähnlich wie:
a1<-runif(100)
a2<-function(i){
a1[i]<-a1[i-1]*a1[i];a1[i]
}
a3<-lapply(2:100,a2)
Ich suche so etwas wie eine für (Schleife), jedoch unter Verwendung der lapply () Infrastruktur. Ich habe nicht in der Lage gewesen rapply (), dies zu tun zu bekommen.
Der Grund dafür ist, dass die „echte“ a2 Funktion eine schwierige Aufgabe ist, dass nur dann ausgewertet werden muss, wenn der Wert von a1 [i-1] einige Kriterien erfüllt.
re-Phrasierung: so ich versuche, die für () im Code zu ersetzen unten durch eine lapply () - Typ Sache:
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))
Die R-Mailingliste hat bis zum Reduce () Funktion geraten suchen .... wie in:
a1<-runif(100)
cadd<-function(x) Reduce("*", x, accumulate = TRUE)
cadd(a1)
, die das gleiche Ergebnis wie cumprod (a1) gibt ... aber ist noch langsamer als die Schleife:
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
>
Jede Idee?
Lösung
Edit: Ihre Klarstellung Folgende: nein, ich glaube nicht, dass Sie eine Anwendung Funktion, etwas zu tun rekursiv so verwenden können. Der ganze Sinn der Auswahl anwenden Funktion ist, dass sie über den Vektor / Matrix zur gleichen Zeit gilt.
Sie können sich auch an dieser Frage im Zusammenhang zu Blick wollen auf Stackoverflow .
Meine alte Antwort:
Versuchen Sie diese:
a1<-runif(100)
a2<-function(i, a1){
a1[i]<-a1[i-1]*a1[i]
a1[i]
}
a3 <- as.numeric(lapply(2:100, a2, a1=a1))
Im Gegensatz zu einer for
Schleife, müssen Sie in einem Verweis auf irgendetwas passieren, dass Sie innerhalb eines lapply
benötigen. Die Rückkehr ist auch eine Liste, so dass Sie es werfen müssen, um wieder in welcher Form auch immer Sie wollen.
Sie mögen vielleicht auch für einfache Möglichkeiten, am plyr Paket suchen diese Art der Sache zu tun.
Darüber hinaus können Sie ohne eine Schleife der Operation tun:
a3 <- a1[-length(a1)] * a1[-1]
Mit anderen Worten sind diese Aussagen vollkommen gleichwertig:
> all((a1[-length(a1)] * a1[-1]) == as.numeric(lapply(2:100, a2, a1=a1)))
[1] TRUE
Aber die erste Version ist vorzuziehen, da es keine Iterationen hat.