有效对象(.对象),当作为脚本运行时,但不在控制台中运行



以下代码在 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 的工作方式有关,但我以前将它与其他各种库和函数一起使用,从未见过这样的东西。知道发生了什么吗?

我可以确认...运行包含对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) 的"确定"版本替换为"损坏"版本并返回错误。

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

因此,我们似乎有 2 个解决方法:

  1. library(methods)
  2. 将您的矩阵版本后退到 1.2-7.1。

两者都不是超级令人满意...我只是想知道矩阵 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 

哦,亲爱的。 我很确定(不是100%!)确定这个问题不应该适用于较新版本的R和Matrix。 尽管如此,我仍然会声称这不是正确意义上的矩阵错误,而是"Rscript"与"R"错误 - 正如@Stu Field已经提到的那样; 默认情况下,Rscript不会将methods包附加到search()路径,但常规 R 会将该包附加到路径。

OTOH,R CMD check Matrix现在应该尝试在没有方法包在搜索路径中的情况下运行 Matrix,因此问题不应该出现在 Matrix 1.2-9 及更高版本中,即默认情况下从 R 3.4.0 和更新版本开始,或者如果您有旧版本的 R,则更新"矩阵"包。

再次:您能否确认R 3.4.0(其中包含矩阵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)

相关内容

  • 没有找到相关文章

最新更新