【问题标题】:Different results from Rscript and R CMD BATCHRscript 和 R CMD BATCH 的不同结果
【发布时间】: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 变量没有被正确地传递到函数中,它正在加载一个不同的类别(啤酒而不是剃须刀),这是一个巨大的文件,不适合测试。

这仍然不能解释为什么 RscriptR CMD BATCH 表现不同。

【问题讨论】:

  • 如果将--no-restore 添加到 r cmd 批处理中会怎样
  • 即将尝试它,这可能是有史以来最愚蠢的问题之一。我的借口:将 20 年的 Windows 换成第一台 Mac。

标签: r command-line parameters


【解决方案1】:

其中一个可能正在加载以前保存的工作区并使用全局变量。您是否检查过您所在的目录是否重要,或者是否存在任何 .Rhistory 文件?确保您没有任何隐藏变量的一种方法是在每个脚本的开头清除空间。例如,rm(list=ls()) 作为 Rscript 的第一行。

此外,您可以使用 sink() 将输出通过 Rscript 管道传输到文件。

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多