hoverinfo - plotly title r
Resultados inconsistentes para f(g(x)) juntos o divididos (2)
Durante una investigación reciente sobre el establecimiento de semillas aleatorias dentro de las funciones, encontré una situación extraña. Considere las funciones f
y g
, cada una de las cuales establece la semilla aleatoria y luego realiza una operación aleatoria simple:
g <- function(size) { set.seed(1) ; runif(size) }
f <- function(x) { set.seed(2) ; x*runif(length(x)) }
Como cada función establece la semilla aleatoria, esperaría que cada función siempre tenga el mismo valor de retorno dada la misma entrada. Esto significa que f(g(2))
debería devolver lo mismo que x <- g(2) ; f(x)
x <- g(2) ; f(x)
. Para mi sorpresa, este no es el caso:
f(g(2))
# [1] 0.1520975 0.3379658
x <- g(2)
f(x)
# [1] 0.04908784 0.26137017
¿Que esta pasando aqui?
El argumento x
de su función f()
solo se evalúa en el momento en que se usa realmente dentro de la función. Esto significa que set.seed(2)
se evalúa antes de la ejecución de la función g()
cuando intenta calcular f(g(2))
.
> f(g(2))
[1] 0.1520975 0.3379658
es básicamente equivalente a:
> set.seed(2)
> set.seed(1)
> result <- runif(2)
> result*runif(length(result))
[1] 0.1520975 0.3379658
Este es un ejemplo del experimento R de doble rendija. Cuando se observa x, actúa como una partícula; cuando no se observa, actúa como una ola. Mirad
g <- function(size) { set.seed(1) ; runif(size) }
f <- function(x) {set.seed(2) ; x*runif(length(x)) }
f2 <- function(x) {print(x); set.seed(2) ; x*runif(length(x)) }
f(g(2))
# [1] 0.1520975 0.3379658
x <- g(2)
f(x)
# [1] 0.04908784 0.26137017
f2(g(2))
# [1] 0.2655087 0.3721239
# [1] 0.04908784 0.26137017
x <- g(2)
f2(x)
# [1] 0.2655087 0.3721239
# [1] 0.04908784 0.26137017
Solo estoy josilbering you. print
está forzando x
. Puedes hacer eso explícitamente
f <- function(x) {force(x); set.seed(2) ; x*runif(length(x)) }
x <- g(2)
f(x)
# [1] 0.04908784 0.26137017
Pero no esto
f(force(g(2)))
# [1] 0.1520975 0.3379658