jupyter 中的 rpy2 正在呼应整个功能
rpy2 in jupyter is echoing the whole function
在尝试将 python 与 RI 连接时,我偶然发现了一个最小的示例:
from rpy2.robjects import FloatVector
from rpy2.robjects.packages import importr
stats = importr('stats')
base = importr('base')
ctl = FloatVector([4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14])
trt = FloatVector([4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69])
group = base.gl(2, 10, 20, labels = ["Ctl","Trt"])
weight = ctl + trt
robjects.globalenv["weight"] = weight
robjects.globalenv["group"] = group
lm_D9 = stats.lm("weight ~ group")
print(stats.anova(lm_D9))
# omitting the intercept
lm_D90 = stats.lm("weight ~ group - 1")
print(base.summary(lm_D90))
哪个工作正常(没有错误)。
但我的输出看起来像:
Analysis of Variance Table
Response: weight
Df Sum Sq Mean Sq F value Pr(>F)
group 1 0.6882 0.68820 1.4191 0.249
Residuals 18 8.7293 0.48496
Call:
(function (formula, data, subset, weights, na.action, method = "qr",
model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE,
contrasts = NULL, offset, ...)
{
ret.x <- x
ret.y <- y
cl <- match.call()
mf <- match.call(expand.dots = FALSE)
m <- match(c("formula", "data", "subset", "weights", "na.action",
"offset"), names(mf), 0L)
mf <- mf[c(1L, m)]
mf$drop.unused.levels <- TRUE
mf[[1L]] <- quote(stats::model.frame)
mf <- eval(mf, parent.frame())
if (method == "model.frame")
return(mf)
else if (method != "qr")
warning(gettextf("method = '%s' is not supported. Using 'qr'",
method), domain = NA)
mt <- attr(mf, "terms")
y <- model.response(mf, "numeric")
.....
意思是整个功能都回传给我了。我可以在某处设置不同的日志级别吗?
发生这种情况是因为调用表达式 (stats.lm("weight ~ group - 1")
) 在传递给 R 之前首先在 Python 中进行评估,并且 summary
的调度函数正在报告调用 R代码。
换句话说,stats.lm
首先在 Python 中求值,而这个 returns 是 R 中函数 lm
的代码,该代码是用你的参数调用的"weight ~ group -1"
)。把它想象成 R 看到你正在使用一个匿名函数,调用形式为 function(myformula) { <do things> ) }("weight ~ group - 1
")`.
避免这种情况的方法可能是评估 R 表达式,其中 R 在调用期间解析与函数 lm
的符号名称关联的值。最简单的是:
robjects.globalenv['myformula'] = "weight ~ group - 1"
lm_D90 = robjects.reval("lm(myformula)")
请注意,您的调用所需的符号被捆绑在命名空间/环境中(可能比将所有内容都放在 globalenv
中更整洁)"
myenv = rpy2.robjects.Environment()
myenv['myformula'] = "weight ~ group - 1"
lm_D90 = robjects.reval("lm(myformula)", myenv)
否则,人们可能还会发现一种更优雅的解决方案,即首先使用 lm()
以编程方式构建未计算的 R 表达式,然后对其进行计算。
在尝试将 python 与 RI 连接时,我偶然发现了一个最小的示例:
from rpy2.robjects import FloatVector
from rpy2.robjects.packages import importr
stats = importr('stats')
base = importr('base')
ctl = FloatVector([4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14])
trt = FloatVector([4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69])
group = base.gl(2, 10, 20, labels = ["Ctl","Trt"])
weight = ctl + trt
robjects.globalenv["weight"] = weight
robjects.globalenv["group"] = group
lm_D9 = stats.lm("weight ~ group")
print(stats.anova(lm_D9))
# omitting the intercept
lm_D90 = stats.lm("weight ~ group - 1")
print(base.summary(lm_D90))
哪个工作正常(没有错误)。 但我的输出看起来像:
Analysis of Variance Table
Response: weight
Df Sum Sq Mean Sq F value Pr(>F)
group 1 0.6882 0.68820 1.4191 0.249
Residuals 18 8.7293 0.48496
Call:
(function (formula, data, subset, weights, na.action, method = "qr",
model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE,
contrasts = NULL, offset, ...)
{
ret.x <- x
ret.y <- y
cl <- match.call()
mf <- match.call(expand.dots = FALSE)
m <- match(c("formula", "data", "subset", "weights", "na.action",
"offset"), names(mf), 0L)
mf <- mf[c(1L, m)]
mf$drop.unused.levels <- TRUE
mf[[1L]] <- quote(stats::model.frame)
mf <- eval(mf, parent.frame())
if (method == "model.frame")
return(mf)
else if (method != "qr")
warning(gettextf("method = '%s' is not supported. Using 'qr'",
method), domain = NA)
mt <- attr(mf, "terms")
y <- model.response(mf, "numeric")
.....
意思是整个功能都回传给我了。我可以在某处设置不同的日志级别吗?
发生这种情况是因为调用表达式 (stats.lm("weight ~ group - 1")
) 在传递给 R 之前首先在 Python 中进行评估,并且 summary
的调度函数正在报告调用 R代码。
换句话说,stats.lm
首先在 Python 中求值,而这个 returns 是 R 中函数 lm
的代码,该代码是用你的参数调用的"weight ~ group -1"
)。把它想象成 R 看到你正在使用一个匿名函数,调用形式为 function(myformula) { <do things> ) }("weight ~ group - 1
")`.
避免这种情况的方法可能是评估 R 表达式,其中 R 在调用期间解析与函数 lm
的符号名称关联的值。最简单的是:
robjects.globalenv['myformula'] = "weight ~ group - 1"
lm_D90 = robjects.reval("lm(myformula)")
请注意,您的调用所需的符号被捆绑在命名空间/环境中(可能比将所有内容都放在 globalenv
中更整洁)"
myenv = rpy2.robjects.Environment()
myenv['myformula'] = "weight ~ group - 1"
lm_D90 = robjects.reval("lm(myformula)", myenv)
否则,人们可能还会发现一种更优雅的解决方案,即首先使用 lm()
以编程方式构建未计算的 R 表达式,然后对其进行计算。