如何将字符串拆分为R中的alist()?

时间:2016-08-29 17:49:49

标签: r string list

我正在使用包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中阅读了答案,但我无法弄清楚如何针对这个特定问题进行调整。

2 个答案:

答案 0 :(得分:2)

alist只返回一个列表,所以你应该能够通过创建一个公式列表来逃脱。

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

答案 1 :(得分:2)

这将完成这项工作:

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