pbr*_*ach 27 packages r rscript
我想使用Rscript以批处理模式运行R文件,但它似乎没有加载我需要的库.我得到的具体错误是:
Error in library(timeSeries) : there is no package called 'timeSeries'
Execution halted
Run Code Online (Sandbox Code Playgroud)
但是我确实有这个包timeSeries,可以从命令行从Rstudio,RGui和R加载它没问题.问题似乎只是在使用Rscript运行脚本时.
我的系统/环境变量配置为:
C:\Program Files\R\R-3.1.0\bin\x64 (Appended to PATH)
R_HOME = C:\Program Files\R\R-3.1.0
R_User = Patrick
Run Code Online (Sandbox Code Playgroud)
我从命令行在RStudio,RGui和R中运行相同版本的R. 我也.Library从这三个来源检查并得到了相同的输出.
如何从命令行运行Rscript与我在R中使用(并已安装)的软件包?
我Rscript script.r在目录所在的Windows命令行中使用Rscript via script.r.
输出Rscript -e print(.Library)是[1] "C:/PROGRA~1/R/R-31~1.0/library"
这与我提到的其他三个选项一致: [1] "C:/PROGRA~1/R/R-31~1.0/library"
但是,如果我把它放在我的脚本中:
print(.libPaths())
library(timeSeries) #This is the package that failed to load
Run Code Online (Sandbox Code Playgroud)
我得到一个输出:
[1] "C:/Program Files/R/R-3.1.0/library"
Error in library(timeSeries) : there is no package called 'timeSeries'
Execution halted
Run Code Online (Sandbox Code Playgroud)
RStudio中的相应调用提供了实际安装包的其他路径:
> print(.libPaths())
[1] "C:/Users/Patrick/Documents/R/win-library/3.1" "C:/Program Files/R/R-3.1.0/library"
Run Code Online (Sandbox Code Playgroud)
简而言之,通过调用Sys.getenv('R_LIBS_USER')R.exe 返回的值需要与在命令行调用它返回的值相同:
Rscript.exe -e "Sys.getenv('R_LIBS_USER')"
Run Code Online (Sandbox Code Playgroud)
和需要在上述值,以被包括在这个命令行调用:
Rscript.exe -e ".libPaths()"
Run Code Online (Sandbox Code Playgroud)
请注意,R_LIBS_USER如果在用户快捷方式的目标字段或目标字段中R_USER更改了值,则R.exe和Rscript.exe之间的值可能会有所不同,并且通常我发现用户库(即)是根本没有在Rscript.exe中设置.RprofileR.exe.libPaths()[2]
由于我喜欢设置R_USER为my USERPROFILE,因此我将以下块放在.R我希望在多台计算机或Rscript.exe .Rprofile(即Rscript -e "path.expand('~/.Rprofile')")上运行的文件的顶部:
# =====================================================================
# For compatibility with Rscript.exe:
# =====================================================================
if(length(.libPaths()) == 1){
# We're in Rscript.exe
possible_lib_paths <- file.path(Sys.getenv(c('USERPROFILE','R_USER')),
"R","win-library",
paste(R.version$major,
substr(R.version$minor,1,1),
sep='.'))
indx <- which(file.exists(possible_lib_paths))
if(length(indx)){
.libPaths(possible_lib_paths[indx[1]])
}
# CLEAN UP
rm(indx,possible_lib_paths)
}
# =====================================================================
Run Code Online (Sandbox Code Playgroud)
正如评论中所提到的,似乎Rscript无法自动识别库路径默认值.我正在编写一个R脚本,需要从不同人的计算机上的命令行获取源代码,所以我提出了这个更通用的解决方法:
library()带lib.loc =参数的调用中包含该路径.无论给定计算机上的路径是什么,这都应该有效.
library.path <- .libPaths()
library("timeseries", lib.loc = library.path)
Run Code Online (Sandbox Code Playgroud)再次感谢上面的@flodel让我走上了正确的道路
| 归档时间: |
|
| 查看次数: |
50475 次 |
| 最近记录: |