vapply usar language funcion data como column r scope apply

usar - ¿Cómo acceder a la variable de alcance global/exterior desde la función R apply?



sapply en r (2)

Usando el operador <<- puede escribir en variables en ámbitos externos:

x = data.frame(age=c(11,12,13), weight=c(100,105,110)) x testme <- function(df) { i <- 0 apply(df, 1, function(x) { age <- x[1] weight <- x[2] cat(sprintf("age=%d, weight=%d/n", age, weight)) i <<- i+1 #this could not access the i variable in outer scope z <<- z+1 #this could not access the global variable }) cat(sprintf("i=%d/n", i)) i } z <- 0 y <- testme(x) cat(sprintf("y=%d, z=%d/n", y, z))

El resultado aquí:

age=11, weight=100 age=12, weight=105 age=13, weight=110 i=3 y=3, z=3

Tenga en cuenta que el uso de <<- es peligroso, ya que rompe el alcance. Haga esto solo si es realmente necesario y si lo hace, documente ese comportamiento claramente (al menos en scripts más grandes)

Parece que no puedo hacer que la función de aplicación acceda / modifique una variable que se declara fuera ... ¿qué da?

x = data.frame(age=c(11,12,13), weight=c(100,105,110)) x testme <- function(df) { i <- 0 apply(df, 1, function(x) { age <- x[1] weight <- x[2] cat(sprintf("age=%d, weight=%d/n", age, weight)) i <- i+1 #this could not access the i variable in outer scope z <- z+1 #this could not access the global variable }) cat(sprintf("i=%d/n", i)) i } z <- 0 y <- testme(x) cat(sprintf("y=%d, z=%d/n", y, z))

Resultados:

age=11, weight=100 age=12, weight=105 age=13, weight=110 i=0 y=0, z=0


intente lo siguiente dentro de su aplicación. Experimenta con el valor de n. Creo que para i debería ser uno menos que para z .

assign("i", i+1, envir=parent.frame(n=2)) assign("z", z+1, envir=parent.frame(n=3))


testme <- function(df) { i <- 0 apply(df, 1, function(x) { age <- x[1] weight <- x[2] cat(sprintf("age=%d, weight=%d/n", age, weight)) ## ADDED THESE LINES assign("i", i+1, envir=parent.frame(2)) assign("z", z+1, envir=parent.frame(3)) }) cat(sprintf("i=%d/n", i)) i }

SALIDA

> z <- 0 > y <- testme(x) age=11, weight=100 age=12, weight=105 age=13, weight=110 i=3 > cat(sprintf("y=%d, z=%d/n", y, z)) y=3, z=3