【问题标题】:How can I split a string into an alist() in R?如何将字符串拆分为 R 中的列表()?
【发布时间】:2016-08-29 17:49:48
【问题描述】:

我正在使用包rethinking,它有一个函数map()map2stan() 来执行贝叶斯估计(后者作为rstan 的接口)。 map()map2stan() 采用 alist() 的公式来定义可能性和先验,例如:

alist(
  height ~ dnorm(mu, sigma),
  mu ~ dnorm(178, 20),
  sigma ~ dunif(0, 50)
)

打印为:

[[1]]
height ~ dnorm(mu, sigma)

[[2]]
mu ~ dnorm(178, 20)

[[3]]
sigma ~ dunif(0, 50)

我正在尝试探索先验的影响,因此我希望能够通过不同的均值和标准差集。我可以将先验信息转换为分号分隔的字符串,例如:

s <- "height ~ dnorm(mu, sigma); mu ~ dnorm(178, 20); sigma ~ dunif(0, 50)" 

我认为我应该能够从中拆分; 并分配给alist()。但我无法弄清楚这最后一步。

我尝试过以下几种变化:

do.call("alist", unlist(strsplit(s,";")))

as.vector(unlist(strsplit(s,";")), mode = "alist")

前者因second argument must be a list 而失败,后者因为as.vector() 没有“alist”模式。

也许更普遍的问题是:如何将字符串放入alist()?我已经阅读了this question 中的答案,但我不知道如何针对这个特定问题进行调整。

【问题讨论】:

    标签: r string list


    【解决方案1】:

    这样就可以了:

    lapply(strsplit(s, ";")[[1]], function(x) parse(text = x)[[1]])
    

    【讨论】:

      【解决方案2】:

      alist 只返回一个列表,因此您应该能够摆脱只创建一个公式列表的情况。

      library(magrittr)
      s %>% 
        strsplit("; ", fixed = TRUE) %>% 
        extract2(1) %>% 
        lapply(as.formula)
      

      【讨论】:

      • 这非常适用于简单的公式,这无疑是我的示例。具有更多术语(如mu &lt;- a[block] + bHeight * height)的更复杂的失败,因为它正在尝试评估表达式。 Error in eval(expr, envir, enclos) : object 'a' not found。关于如何解决这个问题的任何想法?
      • @kmm - 如果你有一堆表达式作为字符串,你就有更大的鱼要炸。
      猜你喜欢
      • 1970-01-01
      • 2021-12-18
      • 2021-10-29
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多