【问题标题】:r purrr problems using walk with save()r purrr 问题使用 walk with save()
【发布时间】:2017-03-05 13:26:23
【问题描述】:

我正在寻求使用 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

【问题讨论】:

    标签: r save purrr


    【解决方案1】:
    iwalk(~ write_csv(.x, file.path("folder_name", paste0(.y, ".csv"))))
    

    【讨论】:

    • 这不会像写的那样工作,因为你没有走过任何东西。你错过了第一个论点
    【解决方案2】:

    imapiwalk 等函数于 2017 年添加到 purrr v0.2.3。这些函数采用列表,但同时允许列表项(简写为 .x)和名称(简写为 @ 987654325@) 进行迭代。

    所以在本例中,您可以动态创建文件名,例如:

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

    或者用简写:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-15
        • 1970-01-01
        • 2018-11-06
        • 2018-10-19
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-07
        相关资源
        最近更新 更多