Поиск…


замечания

Наиболее распространенная ловушка с размахом возникает при распараллеливании. Все переменные и функции должны быть переданы в новую среду, которая запускается в каждом потоке.

Окружающая среда и функции

Переменные, объявленные внутри функции, только существуют (если не переданы) внутри этой функции.

x <- 1

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

y

Ошибка: объект 'y' не найден

Переменные, переданные в функцию, а затем переназначенные, перезаписываются, но только внутри функции .

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

foo(1)
x

5

1

Переменные, назначенные в более высокой среде, чем функция, существуют внутри этой функции, без передачи.

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

4

Субфункции

Функции, вызываемые внутри функции (т. Е. Подфункции), должны быть определены внутри этой функции для доступа к любым переменным, определенным в локальной среде, без передачи.

Это не удается:

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

foo()

Ошибка в bar (): объект 'y' не найден

Это работает:

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

4

Глобальное присвоение

Переменные можно назначить глобально из любой среды, используя <<- . bar() теперь может получить доступ к y .

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

foo()

4

Глобальное задание крайне обескуражено. Очень важно использовать функцию-оболочку или явно вызывать переменные из другой локальной среды.

Явное присвоение сред и переменных

Среды в R можно явно вызвать и назвать. Переменные могут быть явно назначены и вызывать в этих средах или из них.

Обычно создаваемая среда - это среда, в которой заключен package:base или subenvironment внутри package:base .

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

Переменные могут быть явно назначены и вызывать в этих средах или из них.

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

3

3

Так как e2 наследует от e1 , a равно 3 как в e1 и e2 . Однако присвоение a внутри e2 не изменяет значение a в e1 .

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

3

2

Выход функции

Функция on.exit() удобна для очистки переменных, если необходимо назначить глобальные переменные.

Некоторые параметры, особенно для графики, могут быть установлены только глобально. Эта небольшая функция распространена при создании более специализированных графиков.

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

Пакеты и маскировка

Функции и объекты в разных пакетах могут иметь одно и то же имя. Пакет, загруженный позже, «замаскирует» более ранний пакет, и будет напечатано предупреждающее сообщение. При вызове функции по имени будет запущена функция из последнего загруженного пакета. К более ранней функции можно получить доступ явно.

library(plyr)
library(dplyr)

Присоединение пакета: 'dplyr'

Следующие объекты маскируются из пакета: plyr:

упорядочивать, считать, убывать, сбрасывать, id, мутировать, переименовывать, суммировать, суммировать

Следующие объекты маскируются из «package: stats»:

фильтр, лаг

Следующие объекты маскируются из «package: base»:

пересекать, setdiff, setequal, union

При написании кода всегда лучше использовать функции, явно используя package::function() чтобы избежать этой проблемы.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow