Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python rpy2:提取变量中的模型公式无效(tmp,simplify=TRUE)_Python_R_Python 3.x_Rpy2 - Fatal编程技术网

Python rpy2:提取变量中的模型公式无效(tmp,simplify=TRUE)

Python rpy2:提取变量中的模型公式无效(tmp,simplify=TRUE),python,r,python-3.x,rpy2,Python,R,Python 3.x,Rpy2,我试图使用Python中的rpy2接口使用R“NADA”包。最终目标是对左删失环境数据进行生存分析。对于其他函数,Python和R之间的交互似乎是正确的,我能够在R中执行测试函数,但是在通过rpy2尝试相同的操作时,我遇到了一个错误 这是我用Python编写的代码。这完全是虚构的数据 from rpy2.robjects import FloatVector, BoolVector, FactorVector from rpy2.robjects.packages import importr

我试图使用Python中的rpy2接口使用R“NADA”包。最终目标是对左删失环境数据进行生存分析。对于其他函数,Python和R之间的交互似乎是正确的,我能够在R中执行测试函数,但是在通过rpy2尝试相同的操作时,我遇到了一个错误

这是我用Python编写的代码。这完全是虚构的数据

from rpy2.robjects import FloatVector, BoolVector, FactorVector
from rpy2.robjects.packages import importr

nada = importr('NADA')
obs = FloatVector([1.0,2.0,3.0,5.0,56.0,1.0,4.0])
nds = BoolVector([False, True, True, True, True, False, True])
groups = FactorVector([1,0,1,0,1,1,0])

nada.cendiff(obs, nds, groups)
这是我收到的错误消息:

Traceback (most recent call last):
  File "C:/Users/XXXXXXX/rpy2_test.py", line 9, in <module>
    nada.cendiff(obs, nds, groups)
  File "C:\Program Files\Python35\lib\site-packages\rpy2\robjects\functions.py", line 178, in __call__
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
  File "C:\Program Files\Python35\lib\site-packages\rpy2\robjects\functions.py", line 106, in __call__
    res = super(Function, self).__call__(*new_args, **new_kwargs)
rpy2.rinterface.RRuntimeError: Error in terms.formula(tmp, simplify = TRUE) : 
  invalid model formula in ExtractVars
我尝试在列出的rpy2错误行中添加一些打印行,并怀疑在将它们发送到函数时,rpy2删除因子向量中的级别可能存在问题。然而,我在一个新的领域,这可能只是一个红鲱鱼


如果有人能提供一些见解或其他选择,我将不胜感激。我有很多用Python编写的数据处理代码,完全使用R并不是一个好的选择,但R有更多的分析选项,所以我希望rpy2能做到这一点。

当我对rpy2和/或其转换规则之一有疑问时 如果你做了一些意想不到的事情,那么检查起来就相对容易了。 例如:

from rpy2.robjects.vectors import FactorVector
from rpy2.robjects import r, globalenv

# factor with rpy2
groups = FactorVector([1,0,1,0,1,1,0])
# bind it to symbol in R's GlobalEnv
globalenv['groups_rpy2'] = groups

# it is the same as building the factor in R ?
r("""
    ...: groups <- factor(c(1,0,1,0,1,1,0))
    ...: print(identical(groups, groups_rpy2))
    ...: """)
[1]
 TRUE

# apparently so

解决这个问题的一种方法是将对象绑定到R命名空间/环境中的符号,并在该命名空间中计算调用。这可以在任何R环境中完成,但如果使用“GlobalEnv”(在这种情况下,请记住GlobalEnv的内容会一直存在,直到嵌入式R关闭):


(参见中的
as_symbol
的其他用法)

@Parfait感谢您的留言!我在多次测试中改变了长度,看看这是否是一个问题,但它没有改变任何东西。我一定在这里复制并粘贴了不同的版本。它似乎是
survival
包中例程的前端。因此,在R中,您可能会访问Python环境中未加载的依赖项。简单的导入可能不起作用,因为Python中加载的两个对象是单独的全局对象(即,源代码不知道您给它的命名对象)。您可能需要从原始的
survival
重新创建
cendiff
调用,挖掘包的代码!你是对的,cendiff基本上是生存包中survdiff的前端。它将截尾从左截尾反转为右截尾,因此可以应用统计公式并考虑一些其他变量。我试着浏览了一些源代码,并确定了其中的一些部分(如翻转),但还没有确定它如何处理分组。我在NADA包中测试了Kendall Tau功能,并且使用逻辑和数字向量(rpy2中的BoolVector和FloatVector)工作得很好。我怀疑这个问题与rpy2如何将FactorVectors传递到R包有关。非常感谢!它与一些快速剪切和粘贴效果很好。明天我将努力清理我的代码并更好地理解它。我也很欣赏熊猫的联系。在你发表文章之前,我一直试图通过使用pandas数据框和带有rmagic的iPython控制台来解决这个问题,但我不相信一旦我开始循环生成的SQL查询,这会起作用。我相信你链接的globalenv填补了缺失的一部分,没有iPython的复杂性。
from rpy2.robjects.vectors import FactorVector
from rpy2.robjects import r, globalenv

# factor with rpy2
groups = FactorVector([1,0,1,0,1,1,0])
# bind it to symbol in R's GlobalEnv
globalenv['groups_rpy2'] = groups

# it is the same as building the factor in R ?
r("""
    ...: groups <- factor(c(1,0,1,0,1,1,0))
    ...: print(identical(groups, groups_rpy2))
    ...: """)
[1]
 TRUE

# apparently so
setMethod("cendiff", 
          signature(obs="numeric", censored="logical", groups="factor"), 
          cencen.vectors.groups)
cencen.vectors.groups =
function(obs, censored, groups, ...)
{
    cl = match.call()
    f = substitute(Cen(a, b)~g, list(a=cl[[2]], b=cl[[3]], g=cl[[4]]))
    f = as.formula(f)
    environment(f) = parent.frame()
    callGeneric(f, ...)
}
from rpy2.robjects.packages import importr
base = importr('base')
# bind to R symbols
globalenv["obs"] = obs
globalenv["nds"] = nds
globalenv["groups"] = groups

# make the call 
nada.cendiff(base.as_symbol('obs'),
             base.as_symbol('nds'),
             base.as_symbol('groups'))