【问题标题】:Feed unquoted column name to R function [rpy2]将不带引号的列名提供给 R 函数 [rpy2]
【发布时间】:2020-02-24 10:02:32
【问题描述】:

我想借助 rpy2 在 Python 中使用 ICCest(R 库 ICC 中的一个函数)。

ICCest 在 R 中的用法是ICCest(column_a, column_b, data)。 但是,没有办法通过 rpy2 传递不带引号的列名。

如果我执行下面的代码,

import numpy as np
from rpy2.robjects.vectors import DataFrame
from rpy2.robjects.packages import importr
df = DataFrame.from_object({
    'a': np.arange(20).repeat(5),
    'b': np.arange(100),
})
ICC = importr("ICC")
ICC.ICCest('a', 'b', df)

它会出错并给出如下警告:

WARNING:rpy2.rinterface_lib.callbacks:R[write to console]: Error in eval(as.name(y), data, parent.frame()) : object 'b' not found
Calls: <Anonymous> -> eval -> eval

WARNING:rpy2.rinterface_lib.callbacks:R[write to console]: In addition: 
WARNING:rpy2.rinterface_lib.callbacks:R[write to console]: Warning message:

WARNING:rpy2.rinterface_lib.callbacks:R[write to console]: In (function (x, y, data = NULL, alpha = 0.05, CI.type = c("THD",  :
WARNING:rpy2.rinterface_lib.callbacks:R[write to console]: 

WARNING:rpy2.rinterface_lib.callbacks:R[write to console]:  passing a character string to 'y' is deprecated since ICC vesion 2.3.0 and will not be supported in future versions. The argument to 'y' should either be an unquoted column name of 'data' or an object

注意最后一行警告。 我什至如何使用 rpy2 传递“未引用的 'data' 列名”?

【问题讨论】:

  • 当您尝试ICC.ICCest(a, b, df) 时在ab 周围没有引号会发生什么?
  • NameError:未定义名称“a”。毕竟这是 Python。
  • 该错误看起来实际上仅与 'y' 参数有关,并从中删除了引号。那么ICC.ICCest('a', b, df)呢?
  • 没有。我不认为这就是 Python 的工作方式。

标签: python r rpy2


【解决方案1】:
from rpy2.robjects.vectors import DataFrame, FloatVector
df = DataFrame({
    'a': FloatVector(np.arange(20).repeat(5)),
    'b': FloatVector(np.arange(100)),
})

一旦我将 numpy 数组转换为 FloatVector,代码就可以工作了。

另外,最好在这里使用as.nameas.symbol

ICC.ICCest(base.as_name('a'), base.as_name('b'), df)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2020-03-05
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多