Как запустить R скрипт в Python, используя rpy2 - PullRequest
1 голос
/ 25 апреля 2019

Мой вопрос кажется очень простым, но я не могу найти ответ даже в документации по 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?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2019

Зачем использовать 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))
0 голосов
/ 28 апреля 2019

Мой вопрос кажется очень простым, но я не могу найти ответ даже в документации по 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")
...