studio - text in r



Comprender el alcance léxico en R (1)

Normalmente, cuando se analiza en el contexto de R léxico, significa que las variables libres en una función (es decir, las variables que se utilizan en una función pero no están definidas en la función) se buscan en el entorno principal de la función, a diferencia del entorno de el llamador (también conocido como el marco principal) pero no hay variables libres en with.default por lo que el ejemplo no ilustra una violación del alcance léxico en ese sentido.

Por ejemplo, esto ilustra el alcance léxico:

x <- 1
f <- function() x
g <- function() { x <- 0; f() }
g() # 1

La respuesta es 1 porque 1 se define en el entorno en el que se define f . Si R hubiera utilizado el ámbito dinámico en lugar del ámbito léxico, la respuesta habría sido 0 (utilizando el entorno de la persona que llama). Podemos ilustrar cómo R puede emular el alcance dinámico de esta manera:

f <- function() eval.parent(quote(x))
g() # 0

ADICIONAL:

En un comentario a continuación @hadley sugirió que los autores pueden haberse referido al hecho de que el segundo argumento real para with.default no se evalúa léxicamente y esta interpretación parece probable. En lugar de evaluarse en relación con el entorno léxico circundante, el segundo argumento real de with.default se lee en la función with.default como una expresión que utiliza substitute y luego se evalúa en relación con el primer argumento utilizando eval . Existe alguna cuestión de cuál debería ser la definición de alcance léxico, ya que rara vez se define, incluso cuando se debate ampliamente, pero las discusiones típicas en relación con R se refieren a ella como el tratamiento de las variables libres. Ver, por ejemplo, Gentleman & Ihaka .

Estoy leyendo este documento ( copia no agregada ) sobre la evaluación del diseño del lenguaje de programación R, y no puedo entender un ejemplo particular sobre el alcance léxico (o la ausencia del mismo).

En la página 4, los autores proporcionan el siguiente ejemplo del uso de la función with :

with(formaldehyde, carb*optden)

Ellos continúan para decir:

El lector astuto habrá notado que el ejemplo anterior choca con nuestra afirmación de que R tiene un alcance léxico. Como suele ser el caso, R tiene un alcance léxico hasta el punto en que no lo es. R es sobre todo un lenguaje dinámico con acceso reflexivo completo a los datos y la representación del programa en ejecución. En el ejemplo anterior, la implementación de evita el alcance léxico al manipular reflexivamente el entorno. Esto se hace mediante una combinación de evaluación diferida, búsqueda dinámica de nombres y la capacidad de convertir el código en texto y viceversa:

with.default <- function(env, expr, ...)
  eval(substitute(expr),env, enclose=parent.frame())

La función utiliza un substitute para recuperar el árbol de análisis sintáctico no evaluado de su segundo argumento, luego lo evalúa con eval en el entorno constituido por la composición del primer argumento con el entorno léxico circundante. El ' ... ' se usa para descartar cualquier argumento adicional.

¿Cómo es el uso de la función with en este caso una violación de los principios del alcance léxico?





scope