【问题标题】:Mapping python tuple and R list with rpy2?用rpy2映射python元组和R列表?
【发布时间】:2011-03-19 01:23:50
【问题描述】:

我在理解与 rpy2 对象和 python 对象的映射时遇到了一些麻烦。

我有一个函数(x),它在 python 中返回一个元组对象,我想用 R 对象列表或向量映射这个元组对象。

首先,我正在尝试这样做:

# return a python tuple into this r object tlist
robjects.r.tlist = get_max_ticks(x) 

#Convert list into dataframe
r('x <- as.data.frame(tlist,row.names=c("seed","ticks"))')

失败并出现错误: rinterface.RRuntimeError:eval(expr,envir,enclos)中的错误:找不到对象'tlist'

所以我正在尝试另一种策略:

robjects.r["tlist"]  = get_max_ticks(x)
r('x <- as.data.frame(tlist,row.names=c("seed","ticks"))')

失败并出现此错误: TypeError: 'R' 对象不支持项目分配

你能帮我理解吗? 非常感谢!!

【问题讨论】:

    标签: python r mapping tuples rpy2


    【解决方案1】:

    使用globalEnv:

    import rpy2.robjects as ro
    r=ro.r
    
    def get_max_ticks():
        return (1,2)
    ro.globalEnv['tlist'] = ro.FloatVector(get_max_ticks())
    r('x <- as.data.frame(tlist,row.names=c("seed","ticks"))')
    print(r['x'])
    #       tlist
    # seed      1
    # ticks     2
    

    可以使用robjects.r.tlist 这种类型的符号访问R 命名空间中的符号,但您不能以这种方式分配值。分配符号的方法是使用robject.globalEnv

    此外,R 中的某些符号可能包含句点,例如data.frame。您不能使用类似于robjects.r.data.frame 的符号在Python 中访问此类符号,因为Python 对句点的解释不同于R。所以我建议完全避免这种表示法,而是使用 robjects.r['data.frame'],因为无论符号名称是什么,这个符号都有效。

    【讨论】:

    • 这种表示法也不安全,因为之前在某处执行类似 "ro.globalEnv['data.frame'] = ro.r('function(x) NULL')" 的操作会导致问题。我建议使用 DataFrame 类。
    • 感谢 @~unutbu,感谢 @lgautier 在这里和邮件列表中的回复,现在我正在尝试理解手册中 data.frame 对象的示例
    【解决方案2】:

    你也可以一起避免 R 中的赋值:

    import rpy2.robjects as ro
    tlist = ro.FloatVector((1,2))
    keyWordArgs = {'row.names':ro.StrVector(("seed","ticks"))}
    x = ro.r['as.data.frame'](tlist,**keyWordArgs)
    ro.r['print'](x)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 2011-04-27
      • 2017-06-28
      相关资源
      最近更新 更多