【问题标题】:When creating an alist, how to extract a function body at runtime创建alist时,如何在运行时提取函数体
【发布时间】:2019-04-02 18:33:50
【问题描述】:

对 R 很陌生,我正在努力寻找这个问题的答案,但也许我不知道如何表达这个问题,如果之前有人问过这个问题,很抱歉。

我想在 for 循环中将函数/模型列表拟合到数据中,而不是手动执行每个。为此,我需要在 alist 中指定模型,列出以下内容:

flist <- alist(y ~ dnorm(mu, sigma),
               mu <- a + b*x,     # need to replace this line with general function
               a ~ dnorm(0, 100),
               b ~ dnorm(0, 10),
               sigma ~ dunif(0, 10)
)

要在 for 循环中执行此操作,我需要能够将 a + b*x 替换为在运行时选择的某个函数的主体。所以我正在考虑制作它:

flist <- alist(y ~ dnorm(mu, sigma),
               mu <- body(function[i]),
               a ~ dnorm(0, 100),
               b ~ dnorm(0, 10),
               sigma ~ dunif(0, 10)
)

然而,alist 似乎并没有真正评估body(function[i]),这似乎是alist 的一部分。有没有办法在运行时取出身体?

基本上,我所追求的是要评估 alist 中的部分表达式(body(...)),但不是全部(保持 ~/

parse 可以做到这一点吗?

【问题讨论】:

    标签: r list


    【解决方案1】:

    我不确定我是否理解,但是你需要这样的东西吗?

    funs <- list(f1 = function(x) x + 3, f2 = function(x) 2 * x + 2)
    
    
    flist <- alist(y ~ dnorm(mu, sigma),
            mu <- FUN_BODY,     # need to replace this line with general function
            a ~ dnorm(0, 100),
            b ~ dnorm(0, 10),
            sigma ~ dunif(0, 10))
    
    
    flist[[2]] <- eval(substitute(substitute(ARG,
      list(FUN_BODY = body(funs[[2]]))),
      list(ARG = flist[[2]])))
    
    # [[1]]
    # y ~ dnorm(mu, sigma)
    # 
    # [[2]]
    # mu <- 2 * x + 2
    # 
    # [[3]]
    # a ~ dnorm(0, 100)
    # 
    # [[4]]
    # b ~ dnorm(0, 10)
    # 
    # [[5]]
    # sigma ~ dunif(0, 10)
    

    【讨论】:

    • 谢谢,这似乎有效。但是,我很难弄清楚替换是如何工作的。
    • 这不是微不足道的,我不能在评论中给你一个关于substitute 的速成课程,但第一个substitute 调用将ARG 替换为flist[[2]],其中包含一个表达式计算FUN_BODY,然后第二个调用替换 FUN_BODYbody(funs[[2]])
    • 也许这会有所帮助:stackoverflow.com/questions/30771626/…
    【解决方案2】:
    1. 使用list 而不是alist。正如您所注意到的,alist 的全部意义不是评估它的论点。
    2. 不执行分配。目前还不清楚mu &lt;- 部分应该做什么。您是要使用命名参数,还是要指定因变量?

    这可能是你想要的:

    flist <- list(
        y ~ dnorm(mu, sigma),
        body(myfunction),
        a ~ dnorm(0, 100),
        b ~ dnorm(0, 10),
        sigma ~ dunif(0, 10)
    )
    

    但目前尚不清楚如何使用它。我想你可能想使用这样的东西而不是你的第二行:

    mu ~ myfunction(somevar)
    

    也就是说,您需要一个使用myfunction的公式。

    【讨论】:

    • mu 是一个因变量。我想我需要明确说明 mu 等于函数值的关系。我正在使用一本书附带的包(Gelman 等人的贝叶斯数据分析书籍之一......),我相信这就是定义需要列表/列表的 map 函数(最大后验)的原因描述参数的函数关系和先验。
    • @LimokPalantaemon 查看我的编辑。无论如何,指定因变量由关系建模与变量赋值完全不同,因此mu &lt;- … 部分永远不会起作用。
    • 当我直接输入表达式时,&lt;- 正在为我工​​作。以前我认为~ 指的是“从[向右分布] 绘制”之类的东西,而我希望 mu 与函数/表达式的值有直接关系。所以我也可以使用~ 吗?
    • 在这种情况下,如果我使用mu ~ myfunction(somevars),我会遇到一个不同的问题,我不知道如何解决。问题是每个函数都有不同数量的参数(我实际上是在拟合一系列 i-order 多项式)。所以我在运行时将另一个 alist 附加到上面,并带有正确数量的参数。但是,我不确定如何将其应用于上述解决方案。本质上,我所追求的是要评估 alist 中的部分表达式,但不是全部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多