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

bur*_*ger 2 r sparse-matrix rscript

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

m = system.file("external/pores_1.mtx", package = "Matrix")
x = Matrix::readMM(m)
Run Code Online (Sandbox Code Playgroud)

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

source("test.R")
Run Code Online (Sandbox Code Playgroud)

然而,当我执行它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
Run Code Online (Sandbox Code Playgroud)

我不知道这是否与该特定功能有关.我猜这与Rscript的工作原理有关,但我以前用过各种其他库和函数,从未见过这样的东西.知道发生了什么事吗?

Stu*_*eld 5

我可以确认...在运行包含调用的脚本时,我收到完全相同的错误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中).为了确认,我只是将"OK"版本的Matrix(7.1)替换为"损坏"版本并返回错误.

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

所以,看起来我们有2个解决方法:

  1. library(methods)
  2. 将您的Matrix版本修改为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 
Run Code Online (Sandbox Code Playgroud)