作为脚本运行时validObject(.Object)中出现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

以下代码在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: <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调用之间的不同行为

因此,我们似乎有两个解决办法:

  • 库(方法)
  • 将矩阵的版本重新调整为1.2-7.1 两者都不是超令人满意的。。。我只是想知道矩阵1.2-8到底发生了什么。也许在下一个版本中它会被修复

    如果您感兴趣,这是我的
    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)