2017-10-18 3 views
1

Je voudrais appeler un script R, disons myRfile.R, à partir de MatLab. J'utilise une machine Windows 10 avec MatLab 2017a et R-3.4.2. J'utilise la commande system comme suggéré dans une précédente stackoverflow question. La solution est de faire ce qui suit:Appelez le script R de MatLab - Erreur

  1. Ajouter un chemin à l'emplacement d'installation de R. Dans mon cas, j'écris addpath C:\Program Files\R\R-3.4.2\bin.

  2. Assurez-vous que le script R se trouve dans le répertoire de travail (ou un chemin d'accès).

  3. Appelez la fonction system('R CMD BATCH myRfile.R').

I, cependant, obtenir l'indicateur d'erreur = 1 et la suivante est imprimée dans la fenêtre de commande:

« R » est pas reconnu comme une commande interne ou externe, programme exécutable ou fichier batch.

Je vérifia que je peux courir R de cmd en naviguant dans le fichier approprié et d'appeler R.exe. Si, au contraire, je l'appelle system via:

système ('C: \ Program Files \ R \ R-3.4.2 \ bin \ x64 \ r.exe "CMD LOT myRfile.R'); ,

puis le script est exécuté correctement (pas d'erreur). Par conséquent, j'ai trouvé une solution à mon problème. Cependant, je voudrais définir la chaîne

RPATH = "C: \ Program Files \ R \ R-3.4.2 \ bin \ x64 \ r.exe"

au début de mon programme et exécutez la commande

système ('Rpath CMD BATCH myRfile.R');

Cela renvoie une erreur semblable comme précédemment:

« rpath » est pas reconnu comme une commande interne ou externe, programme exécutable ou un fichier de commandes.

Questions:

  1. Pourquoi la commande system('R CMD BATCH myRfile.R') fonctionne pas pour moi?

  2. Pourquoi le travail de commande system si j'écris le répertoire pour R directement sous forme de chaîne, mais il ne fonctionne pas si je passe une chaîne via Rpath à elle?

+0

Mettre '' Rpath '' au milieu de la chaîne ne passe pas la chaîne dans tout langage de programmation que je connais. Utilisez 'sprintf' pour générer l'argument de chaîne à' system'. – excaza

+1

Lorsque vous avez ajouté R au chemin d'accès du système, avez-vous redémarré matlab? Est-ce que 'getenv ('PATH')' inclut le répertoire R? (Est-ce que la page [exécuter des commandes externes de Matlab] (https://www.mathworks.com/help/matlab/matlab_external/run-external-commands-scripts-and-programs.html) fonctionne pour vous? – r2evans

+0

@excaza ' system ('sprintf (Rpath) CMD BATCH Rum_81_genB_VtoH.R') 'ne fonctionne pas.Il retourne l'erreur 'sprintf' n'est pas reconnu ... –

Répondre

2

bâtiment hors @ r2evans commentaires, la solution est d'utiliser setenv plutôt que addpath, puisque system utilise les chemins de système pour rechercher des fichiers. L'espace entre Program et Files est également problématique pour la commande system.

Solution d'échantillon:

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

En général, une façon d'obtenir le chemin correct ouvrir une instance de R et l'entrée de la commande file.path(R.home()). Pour moi, cela renvoie "C:/PROGRA~1/R/R-34~1.2". Finally, append \ bin \ x64`.

@excaza a souligné que la chaîne définissant le chemin vers R doit être entourée de "" afin que cmd interprète correctement les espaces. Solution 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');