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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top