【发布时间】:2014-12-02 15:45:05
【问题描述】:
我在运行 R 脚本时遇到了一个我无法解释的不一致问题。我无法生成可重现的示例,因为入口脚本调用了一整套文件/函数。
将 Rscript 或 RStudio 与 R v3.1.2 一起使用,我得到了我期望的结果,但是当从 bash 调用 R CMD BATCH 时,我的脚本不会产生相同的输出。从 bash 来看,R 似乎可以正确读取命令行参数并从脚本中报告它们,但在我的代码中,只有 Rscript 和 RStudio source 方法似乎在我的代码中正确使用了参数。
2个命令行调用如下:
Rscript ./script/forecast_category_script.R "category='razors'" "cores=4L"
R CMD BATCH --no-save "--args category='razors' cores=4L" ./script/forecast_category_script.R ~/data/output/out.out
出现这些不一致是否有任何明显的原因?我更喜欢使用 R CMD BATCH,因为它将输出重定向到一个文件,当我通过调度程序将我的代码作为批处理作业迁移到大学集群时,我希望能够跟踪它所做的事情。
更新:更改此行可以解决问题,但为什么呢?
以前我在那里有以下行,基本上所以当我测试时,如果我的 RStudio 环境中已经加载了巨大的数据集,我不会继续重新加载它:
if(!exists("spi")) spi = f_load.spi(category = category)
用这个替换它:
spi = f_load.spi(category = category)
基础函数f_load_spi 保持不变:
f_load.spi = function(spi = NULL, category = "razors" , n=NULL) {
# check if the data is pre-loaded
if (is.null(spi)) {
fil = paste0(pth.data.storage, "categories/", category, "/", category, ".sp_ss.interp.rds")
print(fil)
spi = readRDS(fil)
}
# subset to a specific set of items
if (!is.null(n)) {
fc.items = unique(spi$fc.item)
rnd = sample(1:length(fc.items), n)
spi = spi[fc.item %in% fc.items[rnd]]
}
spi
}
由于某种原因,category 变量没有被正确地传递到函数中,它正在加载一个不同的类别(啤酒而不是剃须刀),这是一个巨大的文件,不适合测试。
这仍然不能解释为什么 Rscript 和 R CMD BATCH 表现不同。
【问题讨论】:
-
如果将
--no-restore添加到 r cmd 批处理中会怎样 -
即将尝试它,这可能是有史以来最愚蠢的问题之一。我的借口:将 20 年的 Windows 换成第一台 Mac。
标签: r command-line parameters