Soy un novato en R, y estoy bastante confundido con el uso de variables locales y globales en R.
Leí algunas publicaciones en Internet que dicen si uso =
o <-
asignaré la variable en el entorno actual, y con ella <<-
puedo acceder a una variable global cuando estoy dentro de una función.
Sin embargo, como recuerdo en C ++, las variables locales surgen cada vez que declara una variable entre paréntesis {}
, por lo que me pregunto si esto es lo mismo para R. ¿O es solo para las funciones en R que tenemos el concepto de variables locales?
Hice un pequeño experimento, que parece sugerir que solo los corchetes no son suficientes, ¿me equivoco?
{
x=matrix(1:10,2,5)
}
print(x[2,2])
[1] 4
globalenv(); globalenv() %>% parent.env; globalenv() %>% parent.env %>% parent.env
...Error: could not find function "%>%"
. ¿Es esa otra forma de asignación?require(magrittr)
. Es una forma de aplicar funciones a la derecha (x | f1 | f2 | f3
) en lugar de a la izquierda (f3( f2( f1( x ) ) )
).Respuestas:
Las variables declaradas dentro de una función son locales para esa función. Por ejemplo:
da el error siguiente:
Error: object 'bar' not found
.Si desea hacer
bar
una variable global, debe hacer:En este caso
bar
es accesible desde fuera de la función.Sin embargo, a diferencia de C, C ++ o muchos otros lenguajes, los corchetes no determinan el alcance de las variables. Por ejemplo, en el siguiente fragmento de código:
y
permanece accesible después de laif-else
declaración.Como bien dices, también puedes crear entornos anidados. Puede echar un vistazo a estos dos enlaces para comprender cómo usarlos:
Aquí tienes un pequeño ejemplo:
fuente
<-
realiza tareas en el entorno actual.Cuando estás dentro de una función, R crea un nuevo entorno para ti. Por defecto, incluye todo desde el entorno en el que se creó para que pueda usar esas variables también, pero cualquier cosa nueva que cree no se escribirá en el entorno global.
En la mayoría de los casos,
<<-
se asignará a variables que ya están en el entorno global o creará una variable en el entorno global, incluso si está dentro de una función. Sin embargo, no es tan sencillo como eso. Lo que hace es verificar el entorno primario para una variable con el nombre de interés. Si no lo encuentra en su entorno principal, va al principal del entorno principal (en el momento en que se creó la función) y mira allí. Continúa hacia arriba al entorno global y, si no se encuentra en el entorno global, asignará la variable en el entorno global.Esto podría ilustrar lo que está sucediendo.
La primera vez que imprimimos la barra no hemos llamado
foo
todavía, por lo que aún debería ser global, esto tiene sentido. La segunda vez que imprimimos está dentro defoo
antes de llamar,baz
por lo que el valor "in foo" tiene sentido. Lo siguiente es donde vemos lo<<-
que realmente está haciendo. El siguiente valor impreso es "en baz - antes << -" aunque la declaración de impresión viene después de<<-
. Esto se debe a<<-
que no se ve en el entorno actual (a menos que esté en el entorno global, en cuyo caso<<-
actúa como tal<-
). Entonces, dentro delbaz
valor de la barra permanece como "en baz - antes de << -". Una vez que llamamos abaz
la copia de la barra dentro defoo
se cambia a "in baz", pero como podemos ver, el global nobar
ha cambiado.bar
que se define dentro defoo
está en el entorno principal cuando creamos,baz
por lo que esta es la primera copia de lobar
que<<-
ve y, por lo tanto, la copia a la que se asigna. Entonces,<<-
no es solo asignar directamente al entorno global.<<-
es complicado y no recomendaría usarlo si puedes evitarlo. Si realmente desea asignar al entorno global, puede usar la función de asignación y decirle explícitamente que desea asignar globalmente.Ahora cambio el
<<-
a una declaración de asignación y podemos ver qué efecto tiene:Entonces, las dos veces que imprimimos la barra dentro del
foo
valor está "in foo" incluso después de llamarbaz
. Esto se debe a queassign
nunca consideró la copia delbar
interior de foo porque le dijimos exactamente dónde buscar. Sin embargo, esta vez el valor de la barra en el entorno global cambió porque lo asignamos explícitamente allí.Ahora también preguntó sobre la creación de variables locales y puede hacerlo con bastante facilidad sin crear una función ... Solo necesitamos usar la
local
función.fuente
Un poco más en la misma línea
imprimirá "1"
Imprimirá "20"
fuente