【问题标题】:R Error in validObject(.Object) when running as script, but not in console作为脚本运行时validObject(.Object)中的R错误,但不在控制台中
【发布时间】:2017-09-03 02:38:00
【问题描述】:

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

【问题讨论】:

  • 我无法复制这个。您确定您正在运行的 R 与您正在运行的 Rscript 版本相关吗?也许尝试将library(methods) 添加到脚本中,因为默认情况下 Rscript 不会加载它。
  • 绝对是相同版本的 R 和 Rscript(相同的 bin 和相同的 --version)。
  • 添加library(methods) 有效。发生了什么?

标签: r sparse-matrix rscript


【解决方案1】:

哦,亲爱的。 我很漂亮(不是 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,请更新或更新“Matrix”包。

再次:您能否确认问题已在 R 3.4.0 中消失(“伴随着 Matrix 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)

【讨论】:

    【解决方案2】:

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

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

    所以,我们似乎有两种解决方法:

    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 
    

    【讨论】:

    • 我也在使用 Matrix 1.2-8,所以现在更有意义了。我仍然不知道为什么使用 Rscript 执行会有所不同。
    • 这有所不同,因为当您通过Rscript 命令“踢”脚本时,methods 没有附加,但它是在标准 R 启动时加载的。环境很接近,但不完全相同(我之前假设过!)。比较:Rscript --vanilla -e "sessionInfo()"R --vanilla (start R session) sessionInfo() 方法包附在后者而不是前者。
    • 感谢您的澄清!我不知道。我很惊讶methods 没有被任何其他包加载。即使在加载了几个包之后,我最初也遇到了这个问题。
    • 对我来说也是新闻。学过的知识。然而,它仍然没有回答 Matrix_1.2-8 中的变化。这仍然是个谜。至少在错误修复发布之前有一个解决方法。
    猜你喜欢
    • 2017-12-29
    • 2016-04-04
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    相关资源
    最近更新 更多