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 参数。看起来你只是在给自己制造问题,除非你试图解决其他问题但你没有告诉我们。
我想使用 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 参数。看起来你只是在给自己制造问题,除非你试图解决其他问题但你没有告诉我们。