2017-10-18 3 views
1

Ich möchte ein R-Skript nennen, sagen myRfile.R, von MatLab. Ich verwende eine Windows 10 Maschine mit MatLab 2017a und R-3.4.2. Ich verwende den system Befehl wie in einer früheren stackoverflow question. Die vorgeschlagene Lösung ist folgendes zu tun:R-Skript von MatLab aufrufen - Fehler

  1. Add Pfad zum Installationsort von R. In meinem Fall schreibe ich addpath C:\Program Files\R\R-3.4.2\bin.

  2. Stellen Sie sicher, dass sich das R-Skript im Arbeitsverzeichnis (oder einem Pfad) befindet.

  3. Die Funktion system('R CMD BATCH myRfile.R') aufrufen.

I, jedoch erhalten den Fehler-Flag = 1 ist und folgende in dem Befehlsfenster gedruckt:

‚R‘ ist, als interner oder externer Befehl nicht erkannt wird, ausführbares Programm oder Stapeldatei.

ich geprüft, um sicherzustellen, dass ich R von cmd, indem Sie zu der entsprechenden Datei und R.exe Aufruf ausführen kann. Wenn stattdessen nenne ich system über:

System (' "C: \ Programme \ R \ R-3.4.2 \ bin \ x64 \ r.exe" CMD BATCH myRfile.R'); ,

dann wird das Skript korrekt ausgeführt (kein Fehler). Daher habe ich eine Lösung für mein Problem gefunden. Ich würde aber gerne die Zeichenfolge definieren

rpath = "C: \ Programme \ R \ R-3.4.2 \ bin \ x64 \ r.exe"

zu Beginn von meinem Programm und führen Sie den Befehl

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

Dies gibt einen ähnlichen Fehler wie zuvor:

‚rpath‘ wird nicht als interner oder externer Befehl erkannt, bedienbare Programm oder Batch-Datei. Fragen

:

  1. Warum wird der Befehl system('R CMD BATCH myRfile.R') nicht für mich arbeiten?

  2. Warum funktioniert die system Befehl Arbeit, wenn ich das Verzeichnis für R direkt als String schreiben, aber es funktioniert nicht, wenn ich eine Zeichenfolge über Rpath es passieren?

+0

Putting ''Rpath'' in der Mitte der Zeichenfolge übergibt die Zeichenfolge in keiner Programmiersprache, die mir bekannt ist. Verwenden Sie 'sprintf', um das String-Argument für' system' zu generieren. – excaza

+1

Wenn Sie R zum Systempfad hinzugefügt haben, haben Sie Matlab neu gestartet? Enthält 'getenv ('PATH')' das R-Verzeichnis? (Funktioniert die [Matlab-Seite "externe Befehle ausführen"] (https://www.mathworks.com/help/matlab/matlab_external/run-external-commands-scripts-and-programs.html) Seite für Sie? – r2evans

+0

@excaza ' System ('sprintf (Rpath) CMD BATCH Rum_81_genB_VtoH.R') 'funktioniert nicht.Es gibt den Fehler 'sprintf' ist kein erkanntes ... –

Antwort

2

Gebäude off @ r2evans Kommentare, die Lösung setenv zu verwenden, anstatt addpath, da system die Systempfade für Dateien zu suchen, verwendet. Der Raum zwischen Program und Files ist auch für den Befehl system problematisch.

Probenlösung:

% 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'); 

Im Allgemeinen ein Weg der richtige Pfad zu erhalten, eine Instanz von R und Eingabe file.path(R.home()) den Befehl öffnen. Für mich gibt dies "C:/PROGRA~1/R/R-34~1.2". Finally, append \ bin \ x64` zurück.

@excaza wies darauf hin, dass die Zeichenfolge, die den Pfad zu R definiert, von "" umgeben sein sollte, damit cmd Räume richtig interpretieren. Lösung 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');