【问题标题】:R if/else for loading RData or running codeR if/else 用于加载 RData 或运行代码
【发布时间】:2019-01-22 11:33:44
【问题描述】:

我有兴趣在 R 中找到策略来运行一些代码以产生必要的输出,然后保存,或者如果 RData 文件存在,则加载它而不是运行代码。

举例:

if(!file.exists("saved.RData"){       
    savethis <- c(1,2,3,4)
    save(savethis, file="saved.RData")
}
if(file.exists("saved.RData"){
    load("saved.RData")
}

感谢任何想法,我已经环顾四周,但对此并不多。也对使用什么保存策略感兴趣,我通常将多个对象保存到一个文件中。RData,当然命名适当!

【问题讨论】:

  • 也许if( !("saved.RData" %in% list.files(getwd())) ) { savethis &lt;- c(1,2,3,4) ; save(savethis, file="saved.RData") } else { load("saved.RData") }
  • 谢谢,认为这是我将不得不使用的东西,我认为可能有一些更巧妙的方式,但也许没有!
  • 我想这里唯一的问题是你可能有一些初始数据或代码生成c(1, 2, 3, 4) 可能会改变,如果它确实你想重建“saved.RData”,即使它存在。 Make 并且可能 NextFlow 会为您解决这个问题。如果您想留在 R 中,另一种选择是使用 git2r 将您的代码和数据文件放入 git 存储库中,然后像您的示例一样编写代码来检查您的工作流程的哪些部分发生了变化。
  • 是的,好点。我以交互方式工作,所以当我对我们的结果感到满意时,编辑RData 的保存。对于最终的完整运行,NextFlow 确实会处理输入的更改,因此会创建新的输出。正如您指定的那样,我还拥有Github 上的功能。尚未深入研究git2r,可能现阶段需要!感谢您的意见,非常感谢。

标签: r


【解决方案1】:

考虑为此目的使用make。它是仅在需要构建时才构建的标准工具。它甚至可以检查您构建的 .RData 的前体是否已更改,然后即使存在也重新构建它。

首先你需要安装make;如果你在 linux 上,它可能已经在那里了。在 Windows 上,如果你安装 Rtools 你会得到它。

在您的工作目录中,您将拥有例如两个 Rscript,我们将其称为 foo.R 来创建数据集和 plot.R 来生成绘图和 Makefile(该文件名为“Makefile”)。 Makefile 可能如下所示:

all: plot.pdf

my_data.Rda:foo.R
    Rscript foo.R

plot.pdf:my_data.Rda
    Rscript plot.R

clean:
    rm -f my_data.Rda
    rm -f plot.pdf

“foo.R”可能如下所示:

df <- cars
save(df, file = "my_data.Rda")

“plot.R”可能如下所示:

load("my_data.Rda")

pdf("plot.pdf")
plot(df)
dev.off()

在 Makefile 中,您定义了许多规则。首先是一条规则“全部”,它告诉软件默认情况下要做什么,然后是一条规则,用于您正在构建的项目的每个部分以及它所依赖的内容。在上面我们有一个构建“plot.pdf”的规则,它依赖于“my_data.Rda”,因此如果“plot.pdf”不存在,它只会运行你的“plot.R”脚本,而且my_data.Rda 也必须存在,如果不存在,它将首先生成。安装 make 并在一个目录中生成这三个文件后,您可以尝试以下操作。从终端运行以下命令:

make

这将构建“my_data.Rda”,然后构建“plot.pdf”。现在删除“plot.pdf”文件

rm plot.pdf

然后再次运行 Make:

make

请注意,Make 不需要重建 my_data.Rda 文件,所以它不需要。现在删除这两个文件并重试或运行:

make clean

这条规则只会让您重新开始。如果您使用的是 Rstudio,甚至可以在 buildtools 菜单中选择使用 Makefile 构建项目。

【讨论】:

  • 我使用了一个名为NextFlow 的工作流管理器,它的功能与make 相同,但对用户更友好一些。问题是我也喜欢 Jupyter notebook 的交互性,并热衷于保留该元素,特别是因为分析通常没有定义,但基于结果可以有多个方向。如果它们是预定义的,我会根据您的建议包括在内。
猜你喜欢
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
相关资源
最近更新 更多