【问题标题】:Run every file in a folder运行文件夹中的每个文件
【发布时间】:2013-11-19 22:28:45
【问题描述】:

我可以编写一个 R 脚本来打开和运行文件夹中的每个 R 文件吗?

我知道如何检查文件夹中是否存在文件,如何将文件夹中的每个文件作为文本连接读取,以及如何读取文件夹中的每个数据文件。

但是,我想一次执行一个文件夹中的每个 R 脚本,最好使用单个 R 脚本和在安装期间安装在 Windows 桌面上的默认 R gui。

我怀疑我可能需要从命令行运行 R 并编写某种批处理文件来执行此操作。我很少从命令行运行 R,也从未为 R 编写过批处理文件。

以下是一些示例 R 脚本,它们都存储在名为 run_all_these 的文件夹中:

文件run.one.r 包含:

a <- 10
b <- 20
c <- a+b
c

文件run.two.r 包含:

a <- 10
b <- 20
c <- a-b
c

文件run.three.r 包含:

a <- 10
b <- 20
c <- a*b
c

文件run.four.r 包含:

a <- 10
b <- 20
c <- a/b
c

我在使用 Google 时几乎没有发现任何关于此主题的信息。虽然,我确实在这里找到了一些关于批处理文件的信息:

http://cran.r-project.org/bin/windows/base/rw-FAQ.html

实际上,我的 R 脚本在运行时会各自创建自己的输出文件。所以,我现在最关心的是运行 R 脚本。尽管下一步是打开每个 R 脚本,但将 a10 更改为 100 并再次运行它们。也许这应该是一个后续帖子。

感谢您的任何建议。

编辑 2013 年 11 月 20 日:

在与下面的 Ricardo Saporta 讨论后,我将四个输入文件更改为:

文件run.one.r

a <- 10
b <- 20
c <- a+b
print(c)

文件run.two.r

a <- 10
b <- 20
c <- a-b
print(c)

文件run.three.r

a <- 10
b <- 20
c <- a*b
print(c)

文件run.four.r

a <- 10
b <- 20
c <- a/b
print(c)

【问题讨论】:

  • 谢谢。我曾使用source 读取单个 R 文件,但从未想过使用它来执行文件夹中的每个文件。

标签: r


【解决方案1】:

我的 utils 文件中有以下函数:

## finds all .R files within a folder and soruces them
sourceEntireFolder <- function(folderName, verbose=FALSE, showWarnings=TRUE) { 
  files <- list.files(folderName, full.names=TRUE)

  # Grab only R files
  files <- files[ grepl("\\.[rR]$", files) ]

  if (!length(files) && showWarnings)
    warning("No R files in ", folderName)

  for (f in files) {
    if (verbose)
      cat("sourcing: ", f, "\n")
    ## TODO:  add caught whether error or not and return that
    try(source(f, local=FALSE, echo=FALSE), silent=!verbose)
  }
  return(invisible(NULL))
}

【讨论】:

  • 比我快速而肮脏的方法更好的设计。还可以想象数据文件可能在同一个文件夹中,并且可能需要临时更改工作目录。
  • 这个功能对我来说很新鲜。当我在 R GUI 中使用以下行运行它时:setwd('c:/users/mark w miller/simple R programs'); my.folder &lt;- 'run_all_these'; sourceEntireFolder(my.folder); 我似乎没有获得任何输出。我觉得问得很傻,但是我必须做什么才能看到输出?
  • 如果我将 echo=FALSE 更改为 echo=TRUE 并使用我之前评论中的三行代码,那么我会在默认的 R GUI 中看到输出。
  • @MarkMiller,没有理由 expect 输出,除非您正在采购的文件中存在会生成输出的内容。 echo 标志只是向您显示当前正在执行的内容。
  • 他们没有打印c。他们正在返回c。他们有区别。要打印c,请使用print(c)。另外,不要使用c 作为变量名;)
【解决方案2】:
sapply( list.files(run_all_these, full.names=TRUE), source )

您需要确保 run_all_these 是有效的 Windows 目录规范。

【讨论】:

  • 好方法,只是为了运行 R-Files 你可以做list.files('questionaries/', full.names=F, pattern='\\.[rR]$')
【解决方案3】:

如果您没有子文件夹:

library(tidyverse)

list.files("name_folder", full.names = TRUE) %>% walk(source)

【讨论】:

    猜你喜欢
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2020-07-04
    相关资源
    最近更新 更多