2016-08-29 32 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 - 如果你有一串表情作爲字符串,你有更大的魚來炒。 –

相關問題