R中函数内被quote()包裹的参数eval时无法识别如何解决
错误原因
withReplicates 执行quote()包裹的表达式时,默认求值环境不包含函数内部定义的dataa、datab局部变量,因此会抛出对象未找到的报错。
解决方案
共有两种常用的实现方案:
方案1:用bquote()嵌入局部变量值
直接把dataa、datab的实际值嵌入到待执行的表达式中,不需要依赖环境查找变量,稳定性更高。修改后的函数代码如下:
demofunc <- function(racea, gendera, raceb, genderb){ dataa <- data.frame(race = racea, RIAGENDR = gendera) datab <- data.frame(race = raceb, RIAGENDR = genderb) bootdesign <- as.svrepdesign(nhanesdesign, type = "bootstrap", replicates = 100) # 用bquote的.()语法替换局部变量为实际值 run_expr <- bquote( predict( glm(HI_CHOL ~ race + RIAGENDR, weights = .weights, family = quasibinomial), newdata = .(dataa) ) / predict( glm(HI_CHOL ~ race + RIAGENDR, weights = .weights, family = quasibinomial), newdata = .(datab) ) ) temp <- withReplicates(bootdesign, run_expr) return(temp) }
方案2:指定求值环境为函数局部环境
直接给withReplicates传入env参数,指定表达式在函数的当前环境中求值,就能直接找到局部定义的变量。修改后的函数代码如下:
demofunc <- function(racea, gendera, raceb, genderb){ dataa <- data.frame(race = racea, RIAGENDR = gendera) datab <- data.frame(race = raceb, RIAGENDR = genderb) bootdesign <- as.svrepdesign(nhanesdesign, type = "bootstrap", replicates = 100) temp <- withReplicates(bootdesign, quote( predict( glm(HI_CHOL ~ race + RIAGENDR, weights = .weights, family = quasibinomial), newdata = dataa ) / predict( glm(HI_CHOL ~ race + RIAGENDR, weights = .weights, family = quasibinomial), newdata = datab ) ), env = environment() ) return(temp) }
两种方案都可以正常调用demofunc(racea=1, gendera=2, raceb=2, genderb=2)得到预期结果。
内容的提问来源于stack exchange,提问作者kf86
相关产品推荐
相关产品推荐

