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

5

我想使用 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

使用dplyrfile.R部分不再起作用(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

这是因为批处理文件1是唯一有效的,而在另外两个选项中会出现与2相同的错误。

为什么只有批处理文件1有效?我在所有三个选项中都调用了同样的R脚本。


我以为你说选项1可以在不指定任何选项的情况下工作?难道我误解了你的陈述吗?你的问题还不太清楚。 - cdeterman
修改后现在更清晰了吗?如果还不清楚,您能具体说明哪里不清楚吗?无论如何,感谢您的反馈。 - rmuc8
@Dason 不,我以前试过了。我也读到过关于链式操作符和Rscript之间存在问题的报道,但即使去掉链式操作符也无法解决问题。 - rmuc8
你可以尝试使用littler中的r命令。我经常使用-lpkg1,pkg2,pkg3开关来加载多个必需的包。它还默认加载methods,而且启动速度比Rscript还要快。 - Dirk Eddelbuettel
我会看一下,谢谢 Dirk! - rmuc8
显示剩余3条评论
3个回答

8
--default-packages参数指定默认要加载的包。它不会添加到默认包列表中,而是替换列表。这意味着您还需要指定所有其他基础包。通过编写一个调用 sessionInfo()的简单测试脚本,您可以看到这一点。
在文件"env.R"中:
sessionInfo()

从终端调用:Rscript env.R

这段话是关于在终端中调用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参数。除非您有其他问题需要解决,否则这似乎只会给自己带来麻烦,而您并没有告诉我们其他问题。


“它只会制造问题”,因为正如@Dason所说,您正在错误的方式中使用它。 “默认包”并不等同于“这些默认包加上我需要的几个包”。 - Dirk Eddelbuettel

4

为了完整性并且阐述我的评论,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 自动加载。

0
你可以尝试一下以下的测试吗?我无法将其放入评论中。这在我的系统上运行良好。

test.R

library(dplyr)

data(iris)

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

在你的终端中输入:

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


@rmuc8,没错。你需要使用datasets包来访问iris数据集。 - cdeterman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接