这是我昨天问过的一个问题的补遗:Problems Sourcing in an R file into python using rpy2
在我的案例中,问题有两个问题。 @ MattDMo的解决方案(感谢Matt)调用.R脚本是正确的。但是,我认为我的错误是如何在python脚本中引用文件路径名,然后用于在.R文件中提供源。
在我的python脚本中,我有这个,
codeLoc = "../rcode"
接着是这个,
rpy.r.assign("codeLoc", codeLoc)
此assign函数将代码位置文件路径附加到我尝试输入的R脚本中的变量(“codeLoc”)。
最初,python脚本使用了这个:
rpy.r.source(codeLoc + "/filename.R")
真的很简单! 但是现在rpy2做了一些东西,所以我必须使用字符串等。所以,知道
ro.r("""source('filename.R')""")
ro.r("""source(codeLoc + ('/filename.R')""")
我的预感是我可能需要改变使用rpy2分配codeLoc本身的方式?由于不正确使用assign方法,R和Python可能没有正确地相互通信?
提前致谢...
答案 0 :(得分:1)
新的方式实际上让你的事情变得更轻松。您可以只指定字符串(如果需要,动态调用)并调用它,而不必调用r.assign。例如,
codeLoc = "../rcode"
r_call = "source('" + codeLoc + "/filename.R')"
ro.r(r_call)
修改强> 如果您要打开一系列文件,可以在for循环中动态调用它们。我将讨论两种情况。首先,名称被索引(例如,filename1,filename2等),其次,它们没有被索引。
1)如果文件名的索引是ind_max是最大文件号,你可以source
如下:
for num in range(ind_max):
ro.r("source('" + codeLoc + "/filename" + str(num) + ".R')")
2)如果文件名没有编入索引,你可以通过定义你想要source
的名字列表来做同样的事情:
names = ['spam', 'eggs']
for name in names:
ro.r("source('" + codeLoc + "/filename" + name + ".R')")