2017-04-07 79 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) 
相關問題