我試圖從python執行R腳本,理想地顯示並保存結果。使用rpy2已經有點困難了,所以我想我會直接調用R。我有一種感覺,我需要使用諸如「os.system」或「subprocess.call」之類的東西,但我很難破譯模塊指南。問題在Python中運行程序(R)以執行操作(執行腳本)
這是R腳本「MantelScript」,它使用特定的統計測試來比較兩個距離矩陣(distmatA1和distmatB1)。這在R中有效,儘管我還沒有放入迭代位以讀取和比較一堆文件(,我真的需要一些幫助,太btw了!)::
library(ade4)
M1<-read.table("C:\\pythonscripts\\distmatA1.csv", header = FALSE, sep = ",")
M2<-read.table("C:\\pythonscripts\\distmatB1.csv", header = FALSE, sep = ",")
mantel.rtest(dist(matrix(M1, 14, 14)), dist(matrix(M2, 14, 14)), nrepet = 999)
這是我的python腳本的相關位,它通過一些先前制定的列表讀取並抽出矩陣,以便通過此Mantel測試比較它們(它應該從identityA中拉出第一個矩陣,並將其依次與每個矩陣進行比較identityB,然後用identityB等的第二個矩陣重複)。我想保存這些文件,然後調用R程序進行比較:
# windownA and windownB are lists containing ascending sequences of integers
# identityA and identityB are lists where each field is a distance matrix.
z = 0
v = 0
import subprocess
import os
for i in windownA:
M1 = identityA[i]
z += 1
filename = "C:/pythonscripts/distmatA"+str(z)+".csv"
file = csv.writer(open(filename, 'w'))
file.writerow(M1)
for j in windownB:
M2 = identityB[j]
v += 1
filename2 = "C:/pythonscripts/distmatB"+str(v)+".csv"
file = csv.writer(open(filename2, 'w'))
file.writerow(M2)
## result = os.system('R CMD BATCH C:/R/library/MantelScript.R') - maybe something like this??
## result = subprocess.call(['C:/R/library/MantelScript.txt']) - or maybe this??
print result
print ' '
感謝您的回覆。我暫時選擇在R中編寫腳本,並且在用python保存.csv文件之後執行它,因爲我有時間限制。該代碼仍然存在一個問題,但是(作爲「外行」)發現它更容易處理。 – user393200 2010-07-28 15:01:46
@ vehicularlambslaughter.myopenid.c:「發現它更容易處理」這也是我的看法。一個程序寫文件而另一個程序讀文件的簡單管道是最好的。用「子過程」欺騙太多通常不會有幫助。 – 2010-07-28 18:22:17