2014-12-02 111 views
1

我有一个不一致的问题,在运行R脚本时我无法解释。我无法生成一个可重复的例子,因为有一整套由入口脚本调用的文件/函数。Rscript和R CMD BATCH的不同结果

在R v3.1.2中使用Rscript或RStudio我得到我期待的结果,但是当从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,因为它将输出重定向到一个文件,并且当我通过调度程序将我的代码作为批处理作业迁移到大学群集时,我希望能够遵循已完成的操作。

UPDATE:更改此行可以解决它,但为什么?

以前我曾在那里以下行,基本上所以当我测试,如果它是在我的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表现不同。

+1

如果在r cmd批中添加'--no-restore' – rawr 2014-12-02 18:46:43

+0

即将尝试它,并且可能是有史以来最棘手的问题之一。我的借口是:在Windows上切换20年到第一台Mac。 – 2014-12-02 23:45:43

回答

1

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

此外,您可以使用sink()将输出传输到带有Rscript的文件。