Подтвердить что ты не робот

Запуск R script из python

Я искал этот вопрос и нашел ответы на это, но никто из них, похоже, не работает. Это script, который я использую в python для запуска R script.

import subprocess
retcode = subprocess.call("/usr/bin/Rscript --vanilla -e 'source(\"/pathto/MyrScript.r\")'", shell=True)

и я получаю эту ошибку:

Error in read.table(file = file, header = header, sep = sep, quote = quote,  : 
  no lines available in input
Calls: source ... withVisible -> eval -> eval -> read.csv -> read.table
Execution halted

и вот содержание моего R script (довольно просто!)

data = read.csv('features.csv')
data1 = read.csv("BagofWords.csv")
merged = merge(data,data1)
write.table(merged, "merged.csv",quote=FALSE,sep=",",row.names=FALSE)
for (i in 1:length(merged$fileName))
{
        fileConn<-file(paste("output/",toString(merged$fileName[i]),".txt",sep=""))
        writeLines((toString(merged$BagofWord[i])),fileConn)
        close(fileConn)
}

Функция r script работает нормально, когда я использую source('MyrScript.r') в командной строке r. Более того, когда я пытаюсь использовать точную команду, которую я передаю функции subprocess.call (т.е. /usr/bin/Rscript --vanilla -e 'source("/pathto/MyrScript.r")') в моей командной строке, она работает find, я действительно не понимаю, в чем проблема.

4b9b3361

Ответ 1

Я бы не слишком доверял источнику в вызове Rscript, поскольку вы не можете полностью понять, где вы используете разные вложенные R-сессии. Процесс может завершиться неудачей из-за простых вещей, таких как ваш рабочий каталог, который не является тем, который вы считаете.

Rscript позволяет вам запускать script (см. man Rscript, если вы используете Linux).

Затем вы можете сделать прямо:

subprocess.call ("/usr/bin/Rscript --vanilla /pathto/MyrScript.r", shell=True)

или лучше разобрать команду Rscript и ее параметры в виде списка

subprocess.call (["/usr/bin/Rscript", "--vanilla", "/pathto/MyrScript.r"])

Кроме того, чтобы упростить работу, вы можете создать исполняемый файл R. Для этого вам просто нужно добавить это в первую строку script:

#! /usr/bin/Rscript

и предоставить ему права выполнения. См. здесь для detalis.

Затем вы можете просто выполнить свой вызов python, как если бы это была любая другая команда оболочки или script:

subprocess.call ("/pathto/MyrScript.r")

Ответ 2

Я думаю, что RPy2 стоит заглянуть, вот крутая презентация на R -bloggers.com, чтобы вы начали:

http://www.r-bloggers.com/accessing-r-from-python-using-rpy2/

По сути, он позволяет вам иметь доступ к R-библиотекам с объектами R, которые обеспечивают как интерфейс высокого уровня, так и низкий уровень.

Вот документы в последней версии по состоянию на ноябрь 2013 года:

http://rpy.sourceforge.net/rpy2/doc-2.3/html/index.html

Ответ 3

Я бы не предложил использовать системный вызов, потому что существует много различий между python и R, особенно при передаче данных.

Существует множество стандартных библиотек для вызова R из Python, чтобы выбрать из этого answer

Ответ 4

Если вам просто нужно запустить script, то вы можете использовать system("shell command") из sys lib, доступного import sys. Если у вас есть полезный вывод, вы можете распечатать результат на " > outputfilename" в конце вашей команды оболочки.

Например:

import sys

system("ls -al > output.txt")

Ответ 5

Попробуйте добавить строку к началу вашего R script, в котором говорится:

setwd("path-to-working-directory")

Кроме того, замените путь на путь к папке, содержащей файлы features.csv и BagofWords.csv.

Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что когда вы запускаете этот script из R, ваш рабочий каталог уже является правильным путем, но когда вы запускаете script из python, он по умолчанию использует рабочий каталог где-то в другом месте ( вероятно, в верхней части каталога пользователя).

Добавив дополнительную строку в начале вашего R script, вы явно устанавливаете рабочий каталог, и код, который будет читаться в этих файлах, будет работать. Кроме того, вы можете заменить имена файлов в read.csv() на полные пути к файлам этих файлов.

@dmontaner предложил эту возможность в своем ответе:

Процесс может завершиться неудачно из-за простых вещей, таких как ваш рабочий каталог, который не является тем, который вы считаете.