我正在寻找使用带保存的purrr :: walk功能的帮助。
我有四个dfs的列表,我想写入四个单独的文件。这是我使用的代码和我收到的错误。 .x和...都是相同长度的列表。我确定我犯了一些简单的错误,但不确定那是什么。谢谢你的帮助。
# load libs
library(purrr)
# create dfs to loop over
df <- data.frame(
a = rnorm(10),
b = rnorm(10),
c = rnorm(10),
d = rnorm(10)
)
obj <- list(df1 = df, df2 = df, df3 = df, df4 = df )
# create file names to loop over
path <- "/user/home/"
folder <- "RDa/"
names <- c("df1", "df2", "df3", "df4")
fnames <- lapply(names, function(x) paste0(path, folder, x, ".RDa"))
# iterate
walk(obj, save, fnames)
Error in .f(.x[[i]], ...) : object ‘.x[[i]]’ not found
会话信息
> sessionInfo()
R version 3.2.1 (2015-06-18)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
Running under: OS X 10.7.5 (Lion)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] purrr_0.2.2
loaded via a namespace (and not attached):
[1] magrittr_1.5 tools_3.2.1 Rcpp_0.12.3 knitr_1.12.3
答案 0 :(得分:6)
这样做的一种方法是使用walk2
并将fnames
作为第二个参数(.y
)传递给函数(使用~
来定义函数) 。所以用以下代码替换你的最后一行:
walk2(obj, fnames, ~ save(.x, file = .y))
答案 1 :(得分:1)
iwalk(~ write_csv(.x, file.path("folder_name", paste0(.y, ".csv"))))
答案 2 :(得分:0)
2017年,imap
,iwalk
等功能已添加到purrr
v0.2.3中。这些功能具有一个列表,但允许两个列表项(简写为{{1} })和名称(用简写.x
)进行迭代。
因此在此示例中,您可以动态创建文件名,例如:
.y
或使用速记:
iwalk(obj, function(o, name) {
save(o, paste0(path, folder, name, ".RDa"))
})