Как избежать << - с помощью assign - PullRequest
5 голосов
/ 16 марта 2012

У меня есть два фрагмента кода, которые я часто использую, в которых я использую <<- для назначения Глобальной среде изнутри функции.Я знаю, что должен использовать assign, так как он дает лучший контроль и более предсказуем.Я пытаюсь обернуть голову, используя assign, но не могу передать код <<- в код, который использует assign:

НАБОР ДАННЫХ ФАКТОРОВ И ДВА ЧАСТИ КОДА С <<-

#CREATE A FAKE DATA SET
df <- data.frame(
    x.2=rnorm(25),
    y.2=rnorm(25),
    g=rep(factor(LETTERS[1:5]), 5)
)
#Use split to make a list of data frames
LIST <- split(df, df$g) #split it into a list of data frames
NAMES <- names(LIST) #save the names of this for later use 
LIST <- lapply(seq_along(LIST), function(x) as.data.frame(LIST[[x]])[, 1:2])

#THE TWO PIECES OF CODE THAT USE <<-
#Use Global Assignment to Change All Variable Names of Data Frames in a List
lapply(seq_along(LIST), function(x) names(LIST[[x]]) <<-
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))],
    ".", fixed=T))[c(T, F)]
)
LIST

#Rename All the Data Frames in the List Using Global Assignment
lapply(seq_along(LIST), function(x) names(LIST)[[x]] <<- NAMES[x])
LIST

Мои попытки использовать assign:

lapply(seq_along(LIST), function(x) {
    assign(names(LIST[[x]]), 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))],
    ".", fixed=T))[c(T, F)],  envir=.GlobalEnv)
    }
)
LIST

lapply(seq_along(LIST), function(x) assign(names(LIST)[[x]], 
    NAMES[x], envir=.GlobalEnv))
LIST

Пожалуйста, помогите мне сделать это правильно и объясните, что не так с моим подходом.Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Я не понимаю, почему вы сделали эту задачу очень сложной.Разве это не просто:

LIST <- df[, 1:2]
names(LIST) <- sapply(strsplit(names(LIST), '.', fixed = TRUE), `[`, 1)
LIST <- split(LIST, df$g)

т.е. вы хотите первые 2 столбца df;вам нужны имена до ., и вы разбиваете фрейм данных.Реорганизуйте свои задачи, и вы получите более четкое представление о проблеме.

Кстати, <<- не обязательно является ужасным животным;Вы можете использовать его очень безопасно, создав имя переменной в верхнем окружении, например,

x <- 0
f <- function() x <<- 1

Опасность существует, только если вы вообще не создаете имя переменной в любом месте, поэтому R должен пройти всепуть к глобальной среде, и это, как правило, очень плохая практика.

2 голосов
/ 16 марта 2012

Я думаю, что это одно и то же

LIST <- lapply(seq_along(LIST), function(x) {
  names(LIST[[x]]) <- 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))],
                    ".", fixed=T))[c(T, F)]
  LIST[[x]]
})
LIST

names(LIST) <- NAMES
LIST

или, если использовать assign 1009 * 1005

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...