Назначьте несколько объектов в .GlobalEnv изнутри функции
Сообщение здесь, в один прекрасный день, заставляет меня задаться вопросом, как назначать значения для нескольких объектов в глобальной среде изнутри функции. Это моя попытка с использованием lapply
(assign
может быть более безопасной, чем <<-
, но я никогда не использовал ее и не знаком с ней).
#fake data set
df <- data.frame(
x.2=rnorm(25),
y.2=rnorm(25),
g=rep(factor(LETTERS[1:5]), 5)
)
#split it into a list of data frames
LIST <- split(df, df$g)
#pre-allot 5 objects in R with class data.frame()
V <- W <- X <- Y <- Z <- data.frame()
#attempt to assign the data frames in the LIST to the objects just created
lapply(seq_along(LIST), function(x) c(V, W, X, Y, Z)[x] <<- LIST[[x]])
Пожалуйста, не стесняйтесь сокращать любые/все части моего кода, чтобы сделать эту работу (или работать лучше/быстрее).
Ответы
Ответ 1
Вы правы, что assign()
- правильный инструмент для задания. Его аргумент envir
дает точный контроль над тем, где происходит присвоение - управление, которое недоступно ни с помощью <-
, либо <<-
.
Так, например, чтобы присвоить значение X
объекту с именем NAME
в глобальной среде, вы должны:
assign("NAME", X, envir = .GlobalEnv)
В вашем случае:
df <- data.frame(
x.2=rnorm(25),
y.2=rnorm(25),
g=rep(factor(LETTERS[1:5]), 5)
)
LIST <- split(df, df$g)
NAMES <- c("V", "W", "X", "Y", "Z")
lapply(seq_along(LIST),
function(x) {
assign(NAMES[x], LIST[[x]], envir=.GlobalEnv)
}
)
ls()
[1] "df" "LIST" "NAMES" "V" "W" "X" "Y" "Z"