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