vacio - transformar variables en r
variable-scope en funciones de R (1)
Me gustaría especificar las funciones de una manera flexible. ¿Cómo puedo asegurarme de que el entorno de una función determinada no cambie cuando creo otra función justo después de ella?
Para ilustrar, esto funciona correctamente:
make.fn2 <- function(a, b) {
fn2 <- function(x) {
return( x + a + b )
}
return( fn2 )
}
a <- 2; b <- 3
fn2.1 <- make.fn2(a, b)
fn2.1(3) # 8
fn2.1(4) # 9
a <- 4
fn2.2 <- make.fn2(a, b)
fn2.2(3) # 10
fn2.1(3) # 8
Esto no lo hace
make.fn2 <- function(a, b) {
fn2 <- function(x) {
return( x + a + b )
}
return( fn2 )
}
a <- 2; b <- 3
fn2.1 <- make.fn2(a, b)
a <- 4
fn2.2 <- make.fn2(a, b)
fn2.1(3) # 10
fn2.1(4) # 11
fn2.2(3) # 10
fn2.1(3) # 10
Esto se debe a una evaluación perezosa. La función no se construye realmente hasta que se llama. Entonces, en el segundo caso, las dos veces se recupera la nueva versión de a. Ver también esta otra pregunta .
Puedes resolver este problema usando force
:
make.fn2 <- function(a, b) {
force(a)
force(b)
fn2 <- function(x) {
return( x + a + b )
}
return( fn2 )
}
Esto fuerza a la función a recoger los valores de a
y b
cuando se crea la función, no cuando se llama a la función. Produce la salida correcta:
> a <- 2; b <- 3
> fn2.1 <- make.fn2(a, b)
>
> a <- 4
> fn2.2 <- make.fn2(a, b)
>
> fn2.1(3) # 10
[1] 8
> fn2.1(4) # 11
[1] 9
> fn2.2(3) # 10
[1] 10
> fn2.1(3) # 10
[1] 8
>