R作为脚本运行时在validObject(.Object)中出错,但在控制台

时间:2017-04-07 16:10:57

标签: r sparse-matrix rscript

以下代码在R控制台(R 3.3.0)中正常工作:

m = system.file("external/pores_1.mtx", package = "Matrix")
x = Matrix::readMM(m)

我可以把它放在一个脚本中,它可以在R控制台中正常运行:

source("test.R")

但是,当我以Rscript --vanilla test.RRscript 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的工作原理有关,但我以前用过各种其他库和函数,从未见过这样的东西。知道发生了什么吗?

2 个答案:

答案 0 :(得分:5)

我可以确认...在运行包含对glmnet()的调用的脚本时,我收到了完全相同的错误。我能够将它追溯到glmnet所依赖的Matrix包。

我从v3.3.3反向修改我的R版本 - &gt; v3.3.2并且错误消失了。然后我检查了两者之间的sessionInfo()并发现Matrix包的版本不同......它是1.2-8(在v3.3.3中)和1.2-7.1(在v3.3.2中) 。为了确认,我只是将“OK”版本的Matrix(7.1)替换为“损坏”版本并返回错误。

我还可以确认通过library(methods)显式加载方法包解决了错误(不知何故?),这解释了控制台调用和命令行中的Rscript调用之间的不同行为。

所以,看来我们有两种解决方法:

  1. library(methods)
  2. 将您的Matrix版本恢复为1.2-7.1。
  3. 两者都不是非常令人满意......我只是想知道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 
    

答案 1 :(得分:2)

亲爱的,亲爱的。 我很漂亮(不是100%!)确保此问题不适用于较新版本的R和Matrix。 我仍然认为这是一个正确意义上的Matrix错误,而不是一个&#39; Rscript&#39; vs&#39; R&#39; bug - 正如@Stu Field已提到的那样; Rscript默认情况下不会将methods包附加到search()路径,但是常规R会附加。

OTOH,R CMD check Matrix现在应该尝试在没有方法包在搜索路径中的情况下运行Matrix,因此问题不应该出现在Matrix 1.2-9及更新版本中,即默认情况下从R 3.4开始。 0和更新或然后更新&#39; Matrix&#39;如果您有旧版本的R,请打包。

再次:你能否确认问题已经消失了R 3.4.0(Matrix 1.2-9&#34;以及它&#34;)?

这是一个更有用的示例脚本,我调用了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)