web-dev-qa-db-ja.com

pythonからRスクリプトを実行

私はこの質問を検索し、これに関するいくつかの答えを見つけましたが、どれもうまくいかないようです。これは、Rスクリプトを実行するためにpythonで使用しているスクリプトです。

_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")')に渡す正確なコマンドを使用しようとすると、問題の原因がわかりません。

32
Ehsan

Rscript呼び出し内のsourceをあまり信頼していません。異なるnestedRセッション。作業ディレクトリが考えているものではないなど、単純なことが原因でプロセスが失敗する場合があります。

Rscriptを使用すると、スクリプトを直接実行できます(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実行可能ファイルを作成できます。そのためには、スクリプトの最初の行にこれを追加するだけです。

#! /usr/bin/Rscript

実行権を付与します。詳細については here を参照してください。

次に、他のシェルコマンドまたはスクリプトであるかのようにpython呼び出しを行うことができます。

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

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")
11
Aaron Hall

Rスクリプトの先頭に次のような行を追加してみてください。

_setwd("path-to-working-directory")
_

ただし、パスを、ファイル_features.csv_および_BagofWords.csv_を含むフォルダーへのパスに置き換えます。

あなたが持っている問題は、Rからこのスクリプトを実行するとき、作業ディレクトリはすでに正しいパスであるが、Pythonからスクリプトを実行するとき、それはデフォルトで他のどこかの作業ディレクトリ(おそらくユーザーディレクトリのトップ)。

Rスクリプトの先頭に余分な行を追加することにより、作業ディレクトリを明示的に設定し、これらのファイルを読み込むコードが機能します。または、read.csv()のファイル名をこれらのファイルの完全なファイルパスに置き換えることもできます。

@dmontanerは彼の答えでこの可能性を示唆しました:

作業ディレクトリが考えているものではないなど、単純なことが原因でプロセスが失敗する場合があります。

1
enpitsu

スクリプトを実行したいだけなら、_import sys_で利用可能なsys libのsystem("Shell command")を使用できます。有用な出力がある場合は、シェルコマンドの最後に_" > outputfilename"_で結果を出力できます。

例えば:

_import sys

system("ls -al > output.txt")
_
0
Mips42

特にデータをやり取りする場合、pythonとRの間に多くの違いがあるシステム呼び出しを使用することはお勧めしません。

PythonからRを呼び出す多くの標準ライブラリがあります。選択するには、こちらをご覧ください answer

0
pyCthon