2017-10-18 62 views
1

我想調用一個R腳本,說myRfile.R,從MatLab。我正在使用Windows 10機器,其中MatLab 2017aR-3.4.2。我用的是system命令的建議在以前stackoverflow question.解決的辦法是做到以下幾點:從MatLab調用R腳本 - 錯誤

  1. 添加路徑的R安裝位置。在我的情況下,我寫了 addpath C:\Program Files\R\R-3.4.2\bin

  2. 確保R腳本位於工作目錄(或路徑)中。

  3. 調用函數system('R CMD BATCH myRfile.R')

I,然而,得到的錯誤標誌= 1和下面的印刷在命令窗口:

「R」不被識別爲內部或外部的命令, 可操作的程序或批處理文件。

我檢查,以確保我可以從CMD導航到相應的文件並調用運行R.exeR。相反,如果我呼籲通過system

系統( ' 「C:\ Program Files文件\ r \ R-3.4.2 \ BIN \ 64 \運行R.exe」 CMD批 myRfile.R'); ,

然後腳本正確執行(無錯誤)。因此,我找到了解決我的問題的方法。但是,我想定義字符串

RPATH = 「C:\ Program Files文件\ r \ R-3.4.2 \ BIN \ 64 \運行R.exe」

在開始我的程序並運行命令

system('Rpath CMD BATCH myRfile.R');

這將返回一個類似的錯誤如前:

「RPATH」不被識別爲內部或外部的命令, 運行的程序或批處理文件。

問題:

  1. 爲什麼命令system('R CMD BATCH myRfile.R')不適合我?

  2. 爲什麼會出現system命令工作,如果我寫R直接作爲字符串的目錄,但如果我通過通過Rpath給它一個字符串,它不工作?

+0

將「Rpath」放在字符串中間不會傳遞任何我知道的編程語言中的字符串。使用'sprintf'來生成'system'的字符串參數。 – excaza

+1

當您將R添加到系統路徑中時,是否重新啓動了matlab? 'getenv('PATH')'包含R目錄嗎? ([Matlab的「運行外部命令」](https://www.mathworks.com/help/matlab/matlab_external/run-external-commands-scripts-and-programs.html)頁面爲您工作嗎? – r2evans

+0

@excaza'系統('sprintf(Rpath)CMD BATCH Rum_81_genB_VtoH.R')'不起作用,它返回錯誤'sprintf'不被識別... –

回答

2

大廈關閉@ r2evans意見,解決辦法是使用setenv而非addpath,因爲system使用系統路徑來搜索文件。 ProgramFiles之間的空間對於system命令也有問題。

樣品溶液:

% Get the current set of system paths 
path1 = getenv('PATH'); 
% Append directory for R to the system path  
path1 = [path1'C:\PROGRA~1\R\R-34~1.2\bin\x64']; 
% Update system path 
setenv('PATH', path1) 
% Run the system command. 
system('R CMD BATCH myRfile.R'); 

一般情況下,一個方式來獲得正確的路徑打開R,然後輸入命令file.path(R.home())一個實例。對我而言,這返回"C:/PROGRA~1/R/R-34~1.2". Finally, append \ bin \ x64`。

@excaza指出,定義到R的路徑的字符串應該被""包圍,以便cmd正確解釋空格。解決方案2:

path1 = getenv('PATH'); 
% Append directory for R to the system path  
path1 = [path1'"C:\Program Files\R\R-3.4.2\bin\x64"']; 
% Update system path 
setenv('PATH', path1) 
% Run the system command. 
system('R CMD BATCH myRfile.R');