You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:15:03