r purrr使用walk()函数保存()时出现问题

4

我希望能够使用purrr::walk函数并保存相关结果。在这个问题中,我有四个数据框需要分别写入四个文件中。以下是我的代码以及出现的错误。请注意,.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
3个回答

7

一种做法是使用walk2函数并将fnames作为第二个参数(.y)传递给该函数(使用~定义函数)。因此,用以下代码替换最后一行:

walk2(obj, fnames, ~ save(.x, file = .y))

2
最初的回答:

在2017年,purrr v0.2.3中增加了imapiwalk等函数。这些函数接受一个列表,但允许同时迭代列表项(使用简写.x)和名称(使用简写.y)。

所以在这个例子中,你可以动态创建文件名,例如:

iwalk(obj, function(o, name) {
  save(o, paste0(path, folder, name, ".RDa"))
})

或者使用简写:

iwalk(obj, ~save(.x, paste0(path, folder, .y, ".RDa")))

1
iwalk(~ write_csv(.x, file.path("folder_name", paste0(.y, ".csv"))))

这段代码无法正常运行,因为你没有遍历任何内容。你缺少第一个参数。 - camille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接