我使用R Data Analysis Examples: Ordinal Logistic Regression作为指导进行序数逻辑回归(最终使用rpy2接口在python中)。
在他们测试比例赔率假设的步骤中,他们使用以下公式创建预测估计表:
(s <- with(dat, summary(as.numeric(apply) ~ pared + public + gpa, fun=sf)))
我注意到的一件事是fun =
参数的行为是不同的,如果fun
是大写的。为了了解原因,我在此查看了来源:summary.R source,但只找到了FUN =
。
根据加州大学洛杉矶分校网站(在上面的链接中):“当R看到带有公式参数的摘要调用时,它将通过右侧的组计算公式左侧变量的描述性统计数据。公式并将结果返回到一个漂亮的表中。默认情况下,summary将计算左侧变量的平均值...但是,我们可以通过提供我们自己的函数来覆盖均值的计算,即sf到{{1}最后一个命令要求R将内容返回给对象s,这是一个表。“
我理解这是做什么的,但我不确定参数fun=
在源代码方面的位置(fun =
似乎是默认值,给出了公式的左侧和无视功能sf)。这个覆盖位于何处?这实际上记录了一些地方吗?如果是这样,那么,因为它显然不在帮助文档中。这是我第一次看到R源,所以我会坦然承认我一无所知。
我正在深入研究这个问题的原因是rpy2中的行为与R中的行为不一致。在R中,FUN
和fun =
都产生输出,但在rpy2中,只有{{ 1}}产生输出; FUN =
会引发FUN =
因此,需要深入挖掘来源,找出为什么这不能按预期工作。
修改
成功和失败的python行分别是(我在R中创建了一个名为gms.test的包,它包含函数/ closure sf):
fun =
请注意,调试此代码不是我在此问题中的意图。我只是希望能够看到R中RRuntimeError: Error in as.character(substitute(fun)) :
cannot coerce type 'closure' to vector of type 'character'
覆盖的内容。
答案 0 :(得分:0)
很容易获得来源。根据{{3}},我跑了
getAnywhere(summary.formula)
并获得了相关的代码块:
if (length(fun)) {
if (length(de <- deparse(fun)) == 2) {
de <- as.list(fun)
de <- as.character(de[[length(de)]])
funlab <- if (de[1] == "apply")
de[length(de)]
else de[1]
}
else funlab <- as.character(substitute(fun))
}
因此,如果没有使用默认的fun
,它会尝试转换为字符向量,这就是为什么我不断得到错误关闭强制的原因。在R中,我可以重新创建错误,只需执行as.character(sf)
...(FUN
,btw是一个红色的鲱鱼,因为任何我们不fun
的参数都具有相同的行为。哦,这确实不好玩!