Как запустить R-скрипт на python с использованием rpy2

#python #r #rpy2

#python #r #rpy2

Вопрос:

Мой вопрос кажется очень простым, но я не нахожу ответа даже в документации rpy2. У меня есть *.R-скрипт, который принимает один аргумент как «file.txt » (Мне нужно передать аргумент не из командной строки). Я хочу вызвать R-скрипт внутри скрипта Python. Мои вопросы: Как передать и восстановить аргументы R-скрипту? Мое решение таково: предположим, что R-скрипт запускается с этой строки:

 df <- read.table(args[1], header=FALSE)
"
 here args[1] should be the file which is not passed from the command line
"
....
  

Теперь я пишу функцию в своем python-скрипте:

 from rpy2 import robjects as ro
def run_R(file):
    r = ro.r
    r.source("myR_script.R")
   # how to pass the file argument to
   # the R script and how to
   # recuperate this argument in the R code?
  

Ответ №1:

Зачем использовать rpy2 просто для запуска R-скрипта? Рассмотрите возможность отказа от этого интерфейса и вместо этого используйте автоматическую Rscript.exe командную строку, которую Python может вызывать с помощью встроенного subprocess , как и любой внешний исполняемый файл, даже при передаче необходимых аргументов.

Ниже предполагается, что у вас есть папка R bin в переменной среды PATH для распознавания Rscript . Если нет, добавьте полный путь к этому исполняемому файлу в первый аргумент cmd. Кроме того, не забудьте передать полный путь к файлу в метод run_R:

 from subprocess import Popen, PIPE

def run_R(file):
  # COMMAND WITH ARGUMENTS
  cmd = ["Rscript", "myR_script.R", file]

  p = Popen(cmd, cwd="/path/to/folder/of/my_script.R/"      
            stdin=PIPE, stdout=PIPE, stderr=PIPE)     
  output, error = p.communicate()

  # PRINT R CONSOLE OUTPUT (ERROR OR NOT)
  if p.returncode == 0:            
      print('R OUTPUT:n {0}'.format(output))            
  else:                
      print('R ERROR:n {0}'.format(error))
  

Ответ №2:

Мой вопрос кажется очень простым, но я не нахожу ответа даже в документации rpy2.

Это может быть хорошей отправной точкой, хотя:

https://rpy2.github.io/doc/v3.0.x/html/robjects_rpackages.html#importing-arbitrary-r-code-as-a-package

(…)

 df <- read.table(args[1], header=FALSE)
"
 here args[1] should be the file which is not passed from the command line
"
  

Аргументы командной строки уже давно переданы в R, когда вы туда доберетесь (поскольку R к тому времени уже инициализирован и запущен). Ссылка выше в документации была бы относительно элегантным способом ее решения. В противном случае вы всегда могли бы создать вектор args в R:

 rpy2.robjects.globalenv['args'] = robjects.vectors.StrVector(['my_file.csv'])
r.source("myR_script.R")