从 R 中的完全矢量化函数进行子集化?
subsetting from a fully vectorized function in R?
我写了 Vectorize
d "main" 函数 下面 list
s 三个对象:BF10
, p.value
和 d
。
我想知道为什么将 "main" 函数调用保存为 b
之类的对象( 见下文 ),然后我无法子集 BF10
、p.value
或 d
来自 b
?
也就是说,在运行宁主函数之后,当我运行:
b = BF.d.pvalue(t = c(2.46, 3.21), n1 = c(20, 30), n2 = c(20, NA))
b$BF10 ; b$p.value ; b$d ## None of these return anything !!!
这里是"main"函数:
BF.d.pvalue = Vectorize(function(t, n1, n2 = NA, scale = sqrt(2)/2){
options(warn = -1)
N = ifelse(is.na(n2), n1, (n1*n2)/(n1+n2))
df = ifelse(is.na(n2), n1 - 1, (n1 + n2) - 2)
d = t / sqrt(N)
H1 = integrate(function(delta)dcauchy(delta, 0, scale)*dt(t, df, delta*sqrt(N)), -Inf, Inf)[[1]]
H0 = dt(t, df)
BF10 = H1/H0
p.value = 2*(1-pt(abs(t), df))
cbind(BF10 = BF10, p.value = p.value, d = d)
}, vectorize.args = c("t", "n1", "n2", "scale"))
mapply
默认进行简化。这里的结果已简化为矩阵。你可以做到
b["BF10", ]
b["p.value", ]
b["d", ]
虽然可以设置SIMPLIFY = FALSE
,但结果是嵌套列表
如果您想要可以使用 $
的列表/数据框之类的东西,
怎么样
b <- data.frame(t(b))
我写了 Vectorize
d "main" 函数 下面 list
s 三个对象:BF10
, p.value
和 d
。
我想知道为什么将 "main" 函数调用保存为 b
之类的对象( 见下文 ),然后我无法子集 BF10
、p.value
或 d
来自 b
?
也就是说,在运行宁主函数之后,当我运行:
b = BF.d.pvalue(t = c(2.46, 3.21), n1 = c(20, 30), n2 = c(20, NA))
b$BF10 ; b$p.value ; b$d ## None of these return anything !!!
这里是"main"函数:
BF.d.pvalue = Vectorize(function(t, n1, n2 = NA, scale = sqrt(2)/2){
options(warn = -1)
N = ifelse(is.na(n2), n1, (n1*n2)/(n1+n2))
df = ifelse(is.na(n2), n1 - 1, (n1 + n2) - 2)
d = t / sqrt(N)
H1 = integrate(function(delta)dcauchy(delta, 0, scale)*dt(t, df, delta*sqrt(N)), -Inf, Inf)[[1]]
H0 = dt(t, df)
BF10 = H1/H0
p.value = 2*(1-pt(abs(t), df))
cbind(BF10 = BF10, p.value = p.value, d = d)
}, vectorize.args = c("t", "n1", "n2", "scale"))
mapply
默认进行简化。这里的结果已简化为矩阵。你可以做到
b["BF10", ]
b["p.value", ]
b["d", ]
虽然可以设置SIMPLIFY = FALSE
,但结果是嵌套列表
如果您想要可以使用 $
的列表/数据框之类的东西,
b <- data.frame(t(b))