2016-08-29 30 views
1

我正在使用包rethinking,它具有功能map()map2stan()执行贝叶斯估计(后者作为rstan的接口)。 map()map2stan()采取公式的alist()定义的可能性和先验,如:如何将字符串拆分为R中的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

这将做的工作:

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

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

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

这完全适用于简单的公式,这是无可否认我的例子是什么。更多复杂的术语,比如'mu < - a [block] + bHeight * height',会失败,因为它试图评估表达式。 'eval中的错误(expr,envir,enclos):找不到对象'a'。有关如何解决这个问题的任何想法? – kmm

+3

@kmm - 如果你有一串表情作为字符串,你有更大的鱼来炒。 –

相关问题