我搜索了这个问题并找到了一些答案,但它们似乎都没有用。这是我在python中使用的脚本来运行我的R脚本。
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脚本的内容(非常简单!)
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命令行中使用source('MyrScript.r')
时,r脚本运行正常。此外,当我尝试使用我在命令行中传递给subprocess.call
函数(即/usr/bin/Rscript --vanilla -e 'source("/pathto/MyrScript.r")'
)的确切命令时,它可以找到,我真的不知道是什么问题。
答案 0 :(得分:37)
我不太相信Rscript
调用中的源,因为您可能无法完全理解在哪里运行不同的嵌套 R会话。由于您的工作目录不是您认为的那样简单,因此该过程可能会失败。
Rscript
可让您直接运行脚本(如果您使用的是Linux,请参阅man Rscript
)。
然后你可以直接做:
subprocess.call ("/usr/bin/Rscript --vanilla /pathto/MyrScript.r", shell=True)
或更好地将Rscript
命令及其参数解析为列表
subprocess.call (["/usr/bin/Rscript", "--vanilla", "/pathto/MyrScript.r"])
此外,为了简化操作,您可以创建 R可执行文件。为此,您只需在脚本的第一行添加:
#! /usr/bin/Rscript
并赋予其执行权。有关详细信息,请参阅here。
然后你可以像执行任何其他shell命令或脚本一样进行python调用:
subprocess.call ("/pathto/MyrScript.r")
答案 1 :(得分:10)
我认为RPy2值得研究,这是一篇关于R-bloggers.com的精彩演示,以帮助您入门:
http://www.r-bloggers.com/accessing-r-from-python-using-rpy2/
基本上,它允许您使用提供高级别和低级别接口的R对象访问R库。
以下是最新版本的文档:https://rpy2.readthedocs.io
我喜欢将Python用户指向Anaconda,如果您使用包管理器conda
来安装rpy2
,它还会确保您安装R。
$ conda install rpy2
这是一个基于文件介绍的小插曲:
>>> from rpy2 import robjects
>>> pi = robjects.r['pi']
>>> pi
R object with classes: ('numeric',) mapped to:
<FloatVector - Python:0x7fde1c00a088 / R:0x562b8fbbe118>
[3.141593]
>>> from rpy2.robjects.packages import importr
>>> base = importr('base')
>>> utils = importr('utils')
>>> import rpy2.robjects.packages as rpackages
>>> utils = rpackages.importr('utils')
>>> packnames = ('ggplot2', 'hexbin')
>>> from rpy2.robjects.vectors import StrVector
>>> names_to_install = [x for x in packnames if not rpackages.isinstalled(x)]
>>> if len(names_to_install) > 0:
... utils.install_packages(StrVector(names_to_install))
运行R片段:
>>> robjects.r('''
... # create a function `f`
... f <- function(r, verbose=FALSE) {
... if (verbose) {
... cat("I am calling f().\n")
... }
... 2 * pi * r
... }
... # call the function `f` with argument value 3
... f(3)
... ''')
R object with classes: ('numeric',) mapped to:
<FloatVector - Python:0x7fde1be0d8c8 / R:0x562b91196b18>
[18.849556]
一个小型的独立图形演示:
from rpy2.robjects.packages import importr
graphics = importr('graphics')
grdevices = importr('grDevices')
base = importr('base')
stats = importr('stats')
import array
x = array.array('i', range(10))
y = stats.rnorm(10)
grdevices.X11()
graphics.par(mfrow = array.array('i', [2,2]))
graphics.plot(x, y, ylab = "foo/bar", col = "red")
kwargs = {'ylab':"foo/bar", 'type':"b", 'col':"blue", 'log':"x"}
graphics.plot(x, y, **kwargs)
m = base.matrix(stats.rnorm(100), ncol=5)
pca = stats.princomp(m)
graphics.plot(pca, main="Eigen values")
stats.biplot(pca, main="biplot")
答案 2 :(得分:1)
尝试在R脚本的开头添加一行代码:
setwd("path-to-working-directory")
除此之外,将路径替换为包含文件features.csv
和BagofWords.csv
的文件夹的路径。
我认为您遇到的问题是因为当您从R运行此脚本时,您的工作目录已经是正确的路径,但是当您从python运行脚本时,它默认为其他地方的工作目录(可能是顶部的用户目录)。
通过在R脚本的开头添加额外的行,您将显式设置工作目录,并且要在这些文件中读取的代码将起作用。或者,您可以使用这些文件的完整文件路径替换read.csv()
中的文件名。
@dmontaner在他的回答中提出了这种可能性:
由于简单的事情,例如您的工作目录不是您认为的那个,该过程可能会失败。
答案 3 :(得分:0)
如果您只想运行脚本,则可以使用system("shell command")
提供的sys
库的import sys
。如果您有一个有用的输出,您可以在shell命令的末尾按" > outputfilename"
打印结果。
例如:
import sys
system("ls -al > output.txt")
答案 4 :(得分:-1)
我不建议使用系统调用,python和R之间存在很多差异,尤其是在传递数据时。
有许多标准库可以从Python中调用R来选择,请参阅此answer