Buscar..


Observaciones

El escollo más común con alcance surge en la paralelización. Todas las variables y funciones deben pasarse a un nuevo entorno que se ejecute en cada hilo.

Entornos y funciones

Las variables declaradas dentro de una función solo existen (a menos que se pasen) dentro de esa función.

x <- 1

foo <- function(x) {
    y <- 3
    z <- x + y
    return(z)
}

y

Error: objeto 'y' no encontrado

Las variables pasadas a una función y luego reasignadas se sobrescriben, pero solo dentro de la función .

foo <- function(x) {
    x <- 2
    y <- 3
    z <- x + y
    return(z)
}

foo(1)
x

5

1

Las variables asignadas en un entorno más alto que una función existen dentro de esa función, sin ser pasadas.

foo <- function() {
    y <- 3
    z <- x + y
    return(z)
}
    
foo()

4

Sub funciones

Las funciones llamadas dentro de una función (es decir, subfunciones) deben definirse dentro de esa función para acceder a las variables definidas en el entorno local sin pasarlas.

Esto falla:

bar <- function() {
    z <- x + y
    return(z)
}
    
foo <- function() {
    y <- 3
    z <- bar()
    return(z)
}

foo()

Error en la barra (): objeto 'y' no encontrado

Esto funciona:

foo <- function() {
    
    bar <- function() {
        z <- x + y
        return(z)
    }
    
    y <- 3
    z <- bar()
    return(z)
}
    
foo()

4

Asignación global

Las variables se pueden asignar globalmente desde cualquier entorno utilizando <<- . bar() ahora puede acceder a y .

bar <- function() {
    z <- x + y
    return(z)
}
    
foo <- function() {
    y <<- 3
    z <- bar()
    return(z)
}

foo()

4

La tarea global es altamente desalentada. Se prefiere mucho el uso de una función de envoltorio o la llamada explícita de variables desde otro entorno local.

Asignación explícita de entornos y variables

Los entornos en R se pueden llamar y nombrar explícitamente. Las variables se pueden asignar explícitamente y llamar ao desde esos entornos.

Un entorno creado comúnmente es uno que incluye package:base o un subentorno dentro de package:base .

e1 <- new.env(parent = baseenv())
e2 <- new.env(parent = e1)

Las variables se pueden asignar explícitamente y llamar ao desde esos entornos.

assign("a", 3, envir = e1)
   get("a", envir = e1)
   get("a", envir = e2)

3

3

Como e2 hereda de e1 , a es 3 tanto en e1 como en e2 . Sin embargo, la asignación de a dentro de e2 no cambia el valor de a en e1 .

assign("a", 2, envir = e2)
   get("a", envir = e2)
   get("a", envir = e1)

3

2

Función de salida

La función on.exit() es útil para la limpieza de variables si se deben asignar variables globales.

Algunos parámetros, especialmente aquellos para gráficos, solo se pueden configurar globalmente. Esta pequeña función es común cuando se crean parcelas más especializadas.

new_plot <- function(...) {
     
     old_pars <- par(mar = c(5,4,4,2) + .1, mfrow = c(1,1))
     on.exit(par(old_pars))
     plot(...)
 }

Paquetes y enmascaramiento

Las funciones y los objetos en diferentes paquetes pueden tener el mismo nombre. El paquete cargado más tarde "enmascara" el paquete anterior y se imprimirá un mensaje de advertencia. Al llamar a la función por su nombre, se ejecutará la función del paquete cargado más recientemente. Se puede acceder explícitamente a la función anterior.

library(plyr)
library(dplyr)

Adjuntar paquete: 'dplyr'

Los siguientes objetos están enmascarados desde 'package: plyr':

organizar, contar, desc, fallar con, id, mutar, renombrar, resumir, resumir

Los siguientes objetos están enmascarados de 'package: stats':

filtro, retraso

Los siguientes objetos están enmascarados desde 'paquete: base':

intersectar, setdiff, setequal, union

Al escribir código, siempre es una buena práctica llamar a funciones explícitamente usando package::function() específicamente para evitar este problema.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow