2017-04-07 41 views
1

下面的代码工作正常,在R控制台(R 3.3.0):R错误的脚本运行的时候,而不是在控制台

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的工作原理有关,但之前我曾与其他各种库和函数一起使用过,并且从未见过类似的东西。任何想法发生了什么?

+1

我不能复制这一点。你确定你正在运行的R与你正在运行的相同版本的Rscript绑定吗?也许尝试在脚本中添加'library(methods)',因为Rscript默认不加载。 – MrFlick

+0

绝对是R和Rscript(相同'bin'和相同'--version')的相同版本。 – burger

+0

添加'库(方法)'工作。发生了什么? – burger

回答

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)。为了确认,我简单地用“破碎”版本替换了Matrix(7.1)的“OK”版本,并返回错误。

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

因此,我们似乎有2个变通办法:

  1. library(methods)
  2. 回来修订版的矩阵版本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 
+0

我也在使用Matrix 1.2-8,所以它现在更有意义。我仍然不知道为什么使用Rscript执行有所作为。 – burger

+1

它有所不同,因为'Rscript'命令'脚踢'脚本时'方法'没有附加,但它会在标准R启动时加载。环境非常接近,但并不完全相同(以前我曾经假设过!)。 比较: 'RSCRIPT --vanilla -e “sessionInfo()”' 到 的r --vanilla(开始R对话)'' sessionInfo()' 的方法包被安装在后一种但不前者。 –

+0

感谢澄清!我不知道。我很惊讶'方法'没有被其他软件包加载。我最初在加载一些软件包后遇到了这个问题。 – burger

2

哦,亲爱的。 我很漂亮(不是100%!)确定这个问题不应该适用于新版本的R和Matrix。 仍然我会声称这是而不是一个正确的意义上的矩阵错误,而不是'Rscript'与'R'错误 - 作为@Stu字段已经提到; 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) 
相关问题