gpt4 book ai didi

r - 如何避免 <<- 使用赋值

转载 作者:行者123 更新时间:2023-12-04 19:15:48 25 4
gpt4 key购买 nike

我有两段我经常使用的代码,其中我使用了 <<-从函数内部分配给全局环境。我知道我应该使用 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

我尝试使用分配:
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

请帮助我正确地做到这一点,并解释我的方法有什么问题。先感谢您。

最佳答案

我不明白你为什么让这个任务如此复杂。这不就是:

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

即您想要 df 的前两列;您想要 . 之前的名称,然后拆分数据框。重新组织您的任务,您将对问题有更清晰的认识。

顺便说一句, <<-不一定是可怕的动物;您可以通过在顶级环境中创建变量名称来非常安全地使用它,例如
x <- 0
f <- function() x <<- 1

只有当您根本不在任何地方创建变量名时才会存在危险,因此 R 必须一直到全局环境,这通常是一种非常糟糕的做法。

关于r - 如何避免 <<- 使用赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9730651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com