【问题标题】:Passing vectors and params from Python to R functions将向量和参数从 Python 传递到 R 函数
【发布时间】:2015-02-06 19:31:11
【问题描述】:

我正在学习 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(包装器.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

【问题讨论】:

    标签: python r function rpy2


    【解决方案1】:

    您可以像导入包一样导入 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)
    

    【讨论】:

    • 哇!我知道这违反了“谢谢”和“+1”的规定,但我不在乎。 lgautier,你为我省去了这么多麻烦,而且效果非常好,我不能简单地选择你的作为答案。我必须非常感谢你。
    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多