前一天的帖子让我想知道如何从函数中为全局环境中的多个对象赋值。这是我使用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]])
请随意缩短我的代码的任何/所有部分以使其工作(或更好/更快地工作)。
答案 0 :(得分:29)
2018-10-10更新:
执行此特定任务的最简洁方法是使用list2env()
,如下所示:
## Create an example list of five data.frames
df <- data.frame(x = rnorm(25),
g = rep(factor(LETTERS[1:5]), 5))
LIST <- split(df, df$g)
## Assign them to the global environment
list2env(LIST, envir = .GlobalEnv)
## Check that it worked
ls()
## [1] "A" "B" "C" "D" "df" "E" "LIST"
原始答案,演示使用assign()
你是对的,assign()
是适合这项工作的工具。其envir
参数可让您精确控制分配的位置 - <-
或<<-
无法控制。
因此,例如,要将X
的值分配给全局环境中名为NAME
的对象,您可以这样做:
assign("NAME", X, envir = .GlobalEnv)
在你的情况下:
df <- data.frame(x = 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"
答案 1 :(得分:0)
如果有对象名称和文件路径的列表,则也可以使用mapply
:
object_names <- c("df_1", "df_2", "df_3")
file_paths <- list.files({path}, pattern = ".csv", full.names = T)
mapply(function(df_name, file)
assign(df_name, read.csv(file), envir=.GlobalEnv),
object_names,
file_paths)
list.files()
来构造一个目录中所有.csv文件的向量
特定目录。但是 file_paths 可以用任何方式编写或构造。