当 运行 作为脚本时,validObject(.Object) 中的 R 错误,但不在控制台中
R Error in validObject(.Object) when running as script, but not in console
以下代码在 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.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
不知道是不是和那个特定的功能有关。我猜这与 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 中) .为了确认,我只是用 "broken" 版本替换了 Matrix (7.1) 的 "OK" 版本并返回了错误。
我还可以确认通过 library(methods)
显式加载方法包解决了错误(不知何故?),这解释了控制台调用和命令行 Rscript 调用之间的不同行为。
所以,看来我们有 2 个解决方法:
library(methods)
- 将您的 Matrix 版本恢复到 1.2-7.1。
两者都不是非常令人满意...我只是想知道 Matrix 1.2-8 发生了什么。也许下个版本会修复bug。
如果你有兴趣,这是我的 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。
我仍然会声称这是 不是 一个适当意义上的 Matrix 错误,而是 'Rscript' 与 'R' 错误 - 正如@Stu Field 已经提到的那样; Rscript
默认情况下不会将 methods
包附加到 search()
路径,但常规 R 会。
OTOH,现在 R CMD check Matrix
应该尝试 运行 Matrix 而方法包不在搜索路径中,因此问题不应该出现在 Matrix 1.2-9 和更新版本中,即,默认情况下从 R 3.4.0 和更新版本开始,或者如果你有旧版本的 R,则更新 'Matrix' 包。
再次:您能否确认问题已通过 R 3.4.0(具有 Matrix 1.2-9 "along with it")解决?
这里有一个更有用的示例脚本,我叫 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)
以下代码在 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.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
不知道是不是和那个特定的功能有关。我猜这与 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 中) .为了确认,我只是用 "broken" 版本替换了 Matrix (7.1) 的 "OK" 版本并返回了错误。
我还可以确认通过 library(methods)
显式加载方法包解决了错误(不知何故?),这解释了控制台调用和命令行 Rscript 调用之间的不同行为。
所以,看来我们有 2 个解决方法:
library(methods)
- 将您的 Matrix 版本恢复到 1.2-7.1。
两者都不是非常令人满意...我只是想知道 Matrix 1.2-8 发生了什么。也许下个版本会修复bug。
如果你有兴趣,这是我的 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。
我仍然会声称这是 不是 一个适当意义上的 Matrix 错误,而是 'Rscript' 与 'R' 错误 - 正如@Stu Field 已经提到的那样; Rscript
默认情况下不会将 methods
包附加到 search()
路径,但常规 R 会。
OTOH,现在 R CMD check Matrix
应该尝试 运行 Matrix 而方法包不在搜索路径中,因此问题不应该出现在 Matrix 1.2-9 和更新版本中,即,默认情况下从 R 3.4.0 和更新版本开始,或者如果你有旧版本的 R,则更新 'Matrix' 包。
再次:您能否确认问题已通过 R 3.4.0(具有 Matrix 1.2-9 "along with it")解决?
这里有一个更有用的示例脚本,我叫 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)