将向量和参数从 Python 传递给 R 函数
Passing vectors and params from Python to R functions
我正在学习 Python 和 R,并且在将参数从 Python 传递到名为 "Contours" 的 R 函数时遇到问题。下面的作品......
Python (testr.py)
import rpy2.robjects as robjects
robjects.r('''
source('Wrapper.R')
''')
r_myfunc = robjects.globalenv['Contours']
r_myfunc()
R (Wrapper.R)
source ('./DrawCompRecVark.R')
imageDirectory="./tmp/"
Contours <- function()
{
k=c(0,1)
sens=c(0.8, 0.9, 0.95, 0.995)
spec=0.8
prev=0.001
N=1
uniqueId=1
#graph
prepareSaveGraph(imageDirectory, "PPVkSensSpec-", uniqueId)
DrawSensSpec(k, sens, spec, prev, N)
dev.off()
#save the cNPV graph
prepareSaveGraph(imageDirectory, "cNPVkSensSpec-", uniqueId)
DrawVarcSpec(k, sens, spec, prev, N)
dev.off()
}
正如您所知,我在 R 代码中对值的硬编码工作正常,是从 Python 到 R 的传递让我感到震惊。
我试过了....
R函数
Contours <- function(k, sens, spec, prev, N, uniqueId)
并尝试像这样从 Python 传递....
r_myfunc( c(0,1), c(0.8, 0.9, 0.95, 0.995), 0.8, 0.001, 1, 986)
和
r_myfunc( "c(0,1)", "c(0.8, 0.9, 0.95, 0.995)", 0.8, 0.001, 1, 986)
这两个都不起作用。有没有人遇到过这个?任何指向正确方向的指示将不胜感激。
JW
您可以像导入包一样导入 R 源代码(参见 http://rpy.sourceforge.net/rpy2/doc-2.5/html/robjects_rpackages.html#importing-arbitrary-r-code-as-a-package)
import os
from rpy2.robjects.packages import SignatureTranslatedAnonymousPackage
with open('Wrapper.R') as fh:
rcode = os.linesep.join(fh.readlines())
wrapper = SignatureTranslatedAnonymousPackage(rcode, "wrapper")
现在要调用该名称空间中的函数 Contours
,您只需使用 wrapper.Contours
,但必须使用 Python 语法。在 R 中,标量是长度为 1 的向量,但在 Python 中,标量和序列完全不同。
如果你想使用R的c()
:
from rpy2.robjects.packages import importr
base = importr("base")
wrapper.Contours(base.c(0,1),
base.c(0.8, 0.9, 0.95, 0.995),
0.8, 0.001, 1, 986)
否则:
from rpy2.robjects.vectors import IntVector, FloatVector
wrapper.Contours(IntVector((0,1)),
FloatVector((0.8, 0.9, 0.95, 0.995)),
0.8, 0.001, 1, 986)
我正在学习 Python 和 R,并且在将参数从 Python 传递到名为 "Contours" 的 R 函数时遇到问题。下面的作品......
Python (testr.py)
import rpy2.robjects as robjects
robjects.r('''
source('Wrapper.R')
''')
r_myfunc = robjects.globalenv['Contours']
r_myfunc()
R (Wrapper.R)
source ('./DrawCompRecVark.R')
imageDirectory="./tmp/"
Contours <- function()
{
k=c(0,1)
sens=c(0.8, 0.9, 0.95, 0.995)
spec=0.8
prev=0.001
N=1
uniqueId=1
#graph
prepareSaveGraph(imageDirectory, "PPVkSensSpec-", uniqueId)
DrawSensSpec(k, sens, spec, prev, N)
dev.off()
#save the cNPV graph
prepareSaveGraph(imageDirectory, "cNPVkSensSpec-", uniqueId)
DrawVarcSpec(k, sens, spec, prev, N)
dev.off()
}
正如您所知,我在 R 代码中对值的硬编码工作正常,是从 Python 到 R 的传递让我感到震惊。 我试过了....
R函数
Contours <- function(k, sens, spec, prev, N, uniqueId)
并尝试像这样从 Python 传递....
r_myfunc( c(0,1), c(0.8, 0.9, 0.95, 0.995), 0.8, 0.001, 1, 986)
和
r_myfunc( "c(0,1)", "c(0.8, 0.9, 0.95, 0.995)", 0.8, 0.001, 1, 986)
这两个都不起作用。有没有人遇到过这个?任何指向正确方向的指示将不胜感激。 JW
您可以像导入包一样导入 R 源代码(参见 http://rpy.sourceforge.net/rpy2/doc-2.5/html/robjects_rpackages.html#importing-arbitrary-r-code-as-a-package)
import os
from rpy2.robjects.packages import SignatureTranslatedAnonymousPackage
with open('Wrapper.R') as fh:
rcode = os.linesep.join(fh.readlines())
wrapper = SignatureTranslatedAnonymousPackage(rcode, "wrapper")
现在要调用该名称空间中的函数 Contours
,您只需使用 wrapper.Contours
,但必须使用 Python 语法。在 R 中,标量是长度为 1 的向量,但在 Python 中,标量和序列完全不同。
如果你想使用R的c()
:
from rpy2.robjects.packages import importr
base = importr("base")
wrapper.Contours(base.c(0,1),
base.c(0.8, 0.9, 0.95, 0.995),
0.8, 0.001, 1, 986)
否则:
from rpy2.robjects.vectors import IntVector, FloatVector
wrapper.Contours(IntVector((0,1)),
FloatVector((0.8, 0.9, 0.95, 0.995)),
0.8, 0.001, 1, 986)