如何修改R函数提取sampleN.TOST的样本量Ns并生成列表?
问题分析与解决
你的函数出现空输出的核心原因有两个:
- 循环内重复初始化列表:
result = list()放在循环内部,每次迭代都会清空之前的结果,最终result仅保留最后一次循环的内容,甚至可能因为赋值逻辑问题导致为空。 - 返回类型不符合需求:你需要的是列表,但函数返回了
data.frame(result),如果result赋值失败就会生成空数据框。
修正后的函数(命名列表)
如果需要每个样本量对应其功效值的命名列表,使用以下代码:
pwr.vec = c(0.80, 0.85, 0.90) sample.3.cross = function(x, pwr.vec){ # 提前初始化空列表,避免循环内重置 result = list() for (i in seq_along(pwr.vec)){ target_pwr = pwr.vec[i] # 提取样本量 sample.size = sampleN.TOST(CV = x, design = "3x3", targetpower = target_pwr, theta0 = 1.11)[['Sample size']] # 以功效值为名称存储样本量 result[[as.character(target_pwr)]] = sample.size } return(result) }
修正后的函数(无命名简单列表)
如果只需要单纯的无索引列表,使用以下代码:
pwr.vec = c(0.80, 0.85, 0.90) sample.3.cross = function(x, pwr.vec){ # 提前创建指定长度的列表 result = vector("list", length(pwr.vec)) for (i in seq_along(pwr.vec)){ sample.size = sampleN.TOST(CV = x, design = "3x3", targetpower = pwr.vec[i], theta0 = 1.11)[['Sample size']] result[[i]] = sample.size } return(result) }
调用示例
执行sample.3.cross(.23, pwr.vec)后,会得到包含三个样本量的列表,比如命名列表的输出类似:
$`0.8` [1] 18 $`0.85` [1] 21 $`0.9` [1] 24
内容的提问来源于stack exchange,提问作者Edwin Sanchez
相关产品推荐
相关产品推荐

