Rscript 和包:如何以及何时确定加载了哪些包?

Rscript and Packages: How and when to determine what packages are loaded?

我想使用 Rscript 执行脚本 file.R。在 file.R 中,我使用包 dplyr.

# file.R
df <- data.frame(ID,x,y,z,...)
library(dplyr)
filter(df, ID != "null")
......

如果我没有在批处理文件中指定任何选项,一切正常,因为 file.R 包含行 library(dplyr)

# 1) no specification of packages in the batch file  
Rscript.exe file.R arg1 arg2 arg3 > outputFile.Rout 2>&1

但是,如果我在批处理文件中添加 default-packages=utils

# 2) specification of packages utils in the batch file
Rscript.exe  default-packages=utils file.R arg1 arg2 arg3 > outputFile.Rout 2>&1

file.R 中使用 dplyr 的部分不再有效 (Error in filter(df, ID != 'null') : Object 'ID' could not be found)

因为 ?Rscript

--default-packages=list
where list is a comma-separated list of package names or NULL

我尝试添加 --default-packages=utils,dplyr

# 3) specification of packages utils and dplyr in the batch file
Rscript.exe  default-packages=utils,dplyr file.R arg1 arg2 arg3 > outputFile.Rout 2>&1

这会导致与 2

中相同的错误

为什么批处理文件 1 是唯一有效的文件?我在所有 3 个备选方案中调用相同的 R 脚本。

你能试试下面的测试吗?我不能把它放在评论中。这在我的系统上运行良好。

test.R

library(dplyr)

data(iris)

iris %>%
group_by(Species) %>%
summarise(mean(Sepal.Length))

在您的终端中:

Rscript --default-packages=utils,datasets,dplyr test.R

为了完整性和说明我的评论,Charles 的示例使用 littler 在一行中为我工作。我在这里打破它只是为了说明:

edd@max:~$ r -ldplyr -e'iris %>% \
                        group_by(Species) %>% \         
                        summarise(mean(Sepal.Length)) %>% \
                        print'
Source: local data frame [3 x 2]

     Species mean(Sepal.Length)
1     setosa              5.006
2 versicolor              5.936
3  virginica              6.588
edd@max:~$ 

正如我所说,那真的是一行(一个区别是 r 想要明确 print)。

但是如您所见,datasets 包也由 r 自动加载。

--default-packages 参数指定您要默认加载的包。它不会添加到默认包列表 - 它会替换列表。这意味着您还需要指定您所依赖的所有其他基础包。您可以通过制作一个调用 sessionInfo()

的简单测试脚本来查看这一点

在文件 "env.R" 中:

sessionInfo()

从终端调用:Rscript env.R

R version 3.1.2 (2014-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  base 

现在我修改那个调用:Rscript --default-packages=utils env.R

R version 3.1.2 (2014-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] utils base 

所以您确实需要指定其他缺少的包。

RScript --default-packages=stats,graphics,grDevices,utils,datasets,base,methods env.R

我也把方法放在那里。

话虽如此,如果您只是 运行 使用 RScript 时没有遇到任何问题,我不明白您为什么要搞乱 default-packages 参数。看起来你只是在给自己制造问题,除非你试图解决其他问题但你没有告诉我们。