【问题标题】:Rscript and Packages: How and when to determine what packages are loaded?Rscript 和包:如何以及何时确定加载哪些包?
【发布时间】:2015-06-20 00:33:55
【问题描述】:

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

导致与2中相同的错误

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

【问题讨论】:

  • 您是否觉得有必要在命令行中指定软件包,而不是仅仅将各自的 library 放在脚本的开头?
  • 问题是,将library 放在脚本的开头不是解决方案,这就是我发帖的原因。在所有 3 个备选方案中,我调用了相同的脚本 file.R,它在开始时包含库命令。
  • 我以为您说选项 1 在您未指定任何选项的情况下有效?我误解你的说法了吗?你的问题不是很清楚。
  • 编辑后是否更清晰了?如果没有,你能具体说明什么不清楚吗?无论如何感谢您的反馈。
  • @Dason 不,我以前试过。我还读到过去链接运算符和 Rscript 存在问题,但即使删除链接运算符也无法正常工作。

标签: r batch-file rscript


【解决方案1】:

--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 参数。似乎您只是在为自己制造问题,除非您尝试解决其他未告诉我们的问题。

【讨论】:

  • 它只会产生问题,因为正如@Dason 所说,您以错误的方式使用它。 “默认包”与“这些默认包加上我需要的一些”不一样。
【解决方案2】:

为了完整起见并说明我的评论,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 自动加载。

【讨论】:

    【解决方案3】:

    你能试试下面的测试吗?我不能把这个放在 cmets 里。这在我的系统上运行良好。

    测试.R

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

    在您的终端中:

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

    【讨论】:

    • @rmuc8,那是正确的。您需要datasets 包来访问iris 数据集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2011-09-27
    • 1970-01-01
    • 2023-02-03
    • 2011-01-11
    相关资源
    最近更新 更多