#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.
Это может быть хорошей отправной точкой, хотя:
(…)
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")