R错误的脚本运行的时候,而不是在控制台
下面的代码工作正常,在R控制台(R 3.3.0):R错误的脚本运行的时候,而不是在控制台
m = system.file("external/pores_1.mtx", package = "Matrix")
x = Matrix::readMM(m)
我可以把它放在一个脚本它运行R中控制台细如:
source("test.R")
然而,当我执行它Rscript --vanilla test.R
或Rscript test.R
,我得到一个错误:
Error in validObject(.Object) :
invalid class “dgTMatrix” object: Not a valid 'Mnumeric' class object
Calls: <Anonymous> -> new -> initialize -> initialize -> validObject
Execution halted
我不知道这是否与该特定功能有关。我猜这与Rscript的工作原理有关,但之前我曾与其他各种库和函数一起使用过,并且从未见过类似的东西。任何想法发生了什么?
我可以确认...我在运行包含致电glmnet()
的脚本的脚本时遇到了完全相同的错误。我能够将其追溯回glmnet所依赖的Matrix软件包。
我从v3.3.3 - > v3.3.2回滚了我的R版本,错误消失了。然后我检查了两者之间的sessionInfo()
,发现Matrix
包的版本不同......它是1.2-8(v3.3.3)和1.2-7.1(v3.3.2)。为了确认,我简单地用“破碎”版本替换了Matrix(7.1)的“OK”版本,并返回错误。
我还可以确认通过library(methods)
明确加载方法包可以解决错误(某种程度上?),它解释了控制台调用和命令行中Rscript调用之间的不同行为。
因此,我们似乎有2个变通办法:
library(methods)
- 回来修订版的矩阵版本1.2-7.1。
这两个都不是非常令人满意......我只是想知道Matrix 1.2-8发生了什么。也许它会在下一个版本中被修正。
如果你有兴趣,这里是我的sessionInfo()
:
R version 3.3.3 (2017-03-06)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.2 LTS
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets base
other attached packages:
[1] glmnet_2.0-5 foreach_1.4.3 Matrix_1.2-8
loaded via a namespace (and not attached):
[1] codetools_0.2-15 grid_3.3.3 iterators_1.0.8 methods_3.3.3
[5] lattice_0.20-35
我也在使用Matrix 1.2-8,所以它现在更有意义。我仍然不知道为什么使用Rscript执行有所作为。 – burger
它有所不同,因为'Rscript'命令'脚踢'脚本时'方法'没有附加,但它会在标准R启动时加载。环境非常接近,但并不完全相同(以前我曾经假设过!)。 比较: 'RSCRIPT --vanilla -e “sessionInfo()”' 到 的r --vanilla(开始R对话)'' sessionInfo()' 的方法包被安装在后一种但不前者。 –
感谢澄清!我不知道。我很惊讶'方法'没有被其他软件包加载。我最初在加载一些软件包后遇到了这个问题。 – burger
哦,亲爱的。 我很漂亮(不是100%!)确定这个问题不应该适用于新版本的R和Matrix。 仍然我会声称这是而不是一个正确的意义上的矩阵错误,而不是'Rscript'与'R'错误 - 作为@Stu字段已经提到; Rscript
默认情况下不会将methods
程序包附加到search()
路径,但常规的R程序不会。
OTOH,R CMD check Matrix
现在应该尝试运行Matrix,而不将方法包放在搜索路径中,因此该问题不应出现在Matrix 1.2-9和更新的版本中,即默认从R 3.4.0和更新版本或者如果您有旧版本的R,则更新'Matrix'软件包。
再次强调一下:您能否确认R 3.4.0(其中包含Matrix 1.2-9“随附它”)的问题已消失? ?
这里是一个更有用的示例脚本,我叫Rscript-tst.R
。 运行方式
Rscript --vanilla Rscript-tst.R > Rscript-tst.Rout 2>&1
或(如本人与安装了很多的R版本中)像
`R-3.4.0 RHOME`/bin/Rscript --vanilla Rscript-tst.R > Rscript-tst.Rout_R340 2>&1
Rscript-tst.R
:
options(echo = TRUE)# << even with "Rscript" or --slave ...
(m <- system.file("external/pores_1.mtx", package = "Matrix"))
packageDescription("Matrix")
## This *load*s the Matrix package but does not attach it to search()
str(Matrix::readMM)
sessionInfo()
x <- Matrix::readMM(m)
## used to fail because 'methods' was not "there" (in Rscript only)
我不能复制这一点。你确定你正在运行的R与你正在运行的相同版本的Rscript绑定吗?也许尝试在脚本中添加'library(methods)',因为Rscript默认不加载。 – MrFlick
绝对是R和Rscript(相同'bin'和相同'--version')的相同版本。 – burger
添加'库(方法)'工作。发生了什么? – burger