【发布时间】:2017-11-23 22:16:30
【问题描述】:
我创建了一个用户函数来计算 Hedges 对 g 的 c() 偏差校正(Hedges,1981 年)。它直接基于来自library(metafor) 的metafor::.cmicalc() 函数。它这样做:
hedges_c <- function(df) {
return(exp(lgamma(df / 2) - log(sqrt(df / 2)) - lgamma((df - 1)/2)))
}
当应用于包含值 lgamma() 会生成警告,因为 lgamma(0)(以及任何负值)会生成 NaN。所以,我的解决方案(以及metafor::.cmicalc() 所做的)包括一个ifelse() 声明:
hedges_c <- function(df) {
cdf <- ifelse(df <= 1,
NA,
exp(lgamma(df / 2) - log(sqrt(df / 2)) - lgamma((df - 1)/2)))
return(cdf)
}
但是,这是我似乎找不到解决方案的问题,即使所有值都正确呈现为NA,它仍然会生成warnings()。
例子:
hedges_c(c(0, 0, 20, 14, 0, 0, 0, 0))
#[1] NA NA 0.9619445 0.9452877 NA NA NA NA
#Warning messages:
#1: In ifelse(df <= 1, NA, exp(lgamma(df/2) - log(sqrt(df/2)) - lgamma((df - :
# value out of range in 'lgamma'
#(...)
我了解(例如,来自 this answer)ifelse() 的第三个 (FALSE) 参数即使在条件为 TRUE 时也会被评估(相反,如果我更改条件和参数的顺序)...但我根本不知道如何解决这个问题(除了可能隐藏之前和之后的警告...)。
(注:我也试过dplyr::case_when(),但问题完全一样。)
【问题讨论】:
-
您是否尝试使用
if(...) { ... } else { ... }而不是ifelse(...,...,...)? -
@Heikki:是的,但是当应用于矢量时它不能正常工作。
ifelse()允许对其进行矢量化。
标签: r if-statement metafor