作为脚本运行时validObject(.Object)中出现R错误,但不在控制台中
以下代码在R控制台(R 3.3.0)中运行良好: 我可以将其放入脚本中,并在R控制台中运行良好,如下所示:作为脚本运行时validObject(.Object)中出现R错误,但不在控制台中,r,sparse-matrix,rscript,R,Sparse Matrix,Rscript,以下代码在R控制台(R 3.3.0)中运行良好: 我可以将其放入脚本中,并在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: <An
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
validObject(.Object)中的错误:
无效的类“dgTMatrix”对象:不是有效的“Mnumeric”类对象
调用:->新建->初始化->初始化->有效对象
停止执行
我不知道这是否与特定功能有关。我猜这与Rscript的工作方式有关,但我以前在其他各种库和函数中使用过它,从未见过类似的情况。知道发生了什么吗?我可以确认。。。运行包含对
glmnet()
的调用的脚本时,我遇到了完全相同的错误。我可以追溯到glmnet所依赖的矩阵包
我将我的R版本从v3.3.3->v3.3.2重新修订,错误消失了。然后我检查了两者之间的sessionInfo()
,发现Matrix
包的版本不同。。。它是1.2-8(在v3.3.3中)和1.2-7.1(在v3.3.2中)。为了确认这一点,我简单地将Matrix(7.1)的“OK”版本替换为“Breaked”版本,并返回错误
我还可以确认,通过library(methods)
显式加载methods包可以解决错误(不知何故?),这解释了控制台调用和来自命令行的Rscript调用之间的不同行为
因此,我们似乎有两个解决办法:
库(方法)
sessionInfo()
:
哦,天哪。
我很确定(不是100%!)这个问题不应该出现在新版本的R和Matrix中。
尽管如此,我还是认为这不是一个正确意义上的矩阵bug,而是一个“Rscript”与“R”bug——正如@Stu Field已经提到的<默认情况下,code>Rscript不会将methods
包附加到search()
路径,但常规R会附加
OTOH,R CMD check Matrix
现在应该尝试在搜索路径中没有方法包的情况下运行Matrix,因此Matrix 1.2-9和更新版本不应该出现问题,也就是说,默认情况下,从R 3.4.0和更新版本开始,或者如果您有旧版本的R,则更新“Matrix”包
再一次:您能确认问题在R3.4.0中已经解决了吗(它附带了矩阵1.2-9)
下面是一个更有用的示例脚本,我称之为Rscript tst.R
。
作为
或者(就像我自己安装了很多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)
options(echo=TRUE)#我无法复制这个。您确定您正在运行的R与您正在运行的Rscript版本绑定吗?可能尝试将库(方法)
添加到脚本中,因为默认情况下Rscript不会加载该库。绝对是R和Rscript的相同版本(相同的bin
和相同的--版本
)。添加库(方法)
有效。发生了什么事?我还使用了矩阵1.2-8,所以现在更有意义了。我仍然不知道为什么使用Rscript执行会产生不同。这会产生不同,因为当您通过Rscript
命令“踢”脚本时,不会附加methods
,而是在标准R启动时加载。这些环境很接近,但并不完全相同(我以前曾假设过!)。比较:Rscript--vanilla-e“sessionInfo()”
到R--vanilla(启动R会话)
sessionInfo()
方法包附在后者中,而不是前者。感谢澄清!我不知道。我很惊讶方法
没有被任何其他包加载。我最初遇到这个问题,甚至在加载了几个包之后。这对我来说也是新闻。吸取的教训。然而,它仍然不能回答矩阵_1.2-8中的变化。这仍然是个谜。在发布bug修复之前,至少还有一个解决方案。
Rscript --vanilla Rscript-tst.R > Rscript-tst.Rout 2>&1
`R-3.4.0 RHOME`/bin/Rscript --vanilla Rscript-tst.R > Rscript-tst.Rout_R340 2>&1
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)