2015-03-24 116 views
0

我有一個布爾表達式列表,需要在隨機生成的起始點(數據矩陣行)進行求值。我想在R中編寫一個包裝函數,它可以提取列表g的每個元素並將其轉換爲可以評估的函數。例如,參見列表g,第一個元素是(!x [2] &!x [3])| (!x [2] & x [3])| (x [2] & x [3]),我想寫它作爲 function(x){(!x [2] &!x [3])| (!x [2] & x [3])| (x [2] & x [3])},以便我可以按照以下方式評估數據矩陣的行。我想爲列表g的所有元素執行此操作。將表達式轉換爲R函數

h1<-function(x){(!x[2] & !x[3]) | (!x[2] & x[3]) | (x[2] & x[3])} 
h1(data[,1]) 
[1] TRUE 
h1(data[2,]) 
[1] TRUE 

g<-list(structure("(!x[2] & !x[3]) | (!x[2] & x[3]) | (x[2] & x[3])", class = "noquote"), 
    structure("(!x[2] & !x[1]) | (!x[2] & x[1]) | (x[2] & !x[1])", class = "noquote"), 
    structure("(!x[2] & x[3]) | (x[2] & !x[3])", class = "noquote")) 

> g 
[[1]] 
[1] (!x[2] & !x[3]) | (!x[2] & x[3]) | (x[2] & x[3]) 

[[2]] 
[1] (!x[2] & !x[1]) | (!x[2] & x[1]) | (x[2] & !x[1]) 

[[3]] 
[1] (!x[2] & x[3]) | (x[2] & !x[3]) 

gendata <- function(n,p) { 
    matrix(rbinom(n * p, 1, 0.5), ncol = p, nrow = n) 
} 

data<-gendata(5,3) 
data 
[,1] [,2] [,3] 
[1,] 0 0 0 
[2,] 1 1 1 
[3,] 1 0 1 
[4,] 1 1 1 
[5,] 1 1 0 

我寫了這個包裝函數,但它不起作用,我不知道我做錯了什麼。我對編寫R函數很感興趣,並會很感激幫助。

wrapper <-function(y) {function(x) {(y)}} 
lapply(g,wrapper) 
    [[1]] 
    function (x) 
    { 
    (y) 
} 
<environment: 0x0000000008d848f8> 

[[2]] 
function (x) 
{ 
    (y) 
} 
<environment: 0x0000000008d84a80> 

[[3]] 
function (x) 
{ 
(y) 
} 

+0

只是好奇你爲什麼使用noquote類 – 2015-03-25 02:02:41

+0

上面給出的g只是一個玩具的例子。我所擁有的實際的g有超過50個這樣的字符串,並且是與上面具有相同結構的其他函數的結果。 – user24318 2015-03-25 03:43:08

回答

2

你所試圖做的是分析和評估的字符串。

E <- function (...) {eval(parse(text=paste(...,collapse=" ")))} 

然後從字符串生成功能的包裝函數變爲:

wrapper <- function(s){E("function(x){",s,"}")} 

而且你可以將它應用於g生成您的功能列表這可以通過E功能以下來完成:

ListOfFunctions <- lapply(g, wrapper) 

對於這項工作,g可以僅僅是你給的例子中,字符串列表,無需對「noq uote「屬性。

目前還不清楚你想如何使用矩陣。

+0

感謝您的評論。但抱歉不明白你的建議。目前我的g是 [[1]] [1](!x [2]&!x [3])| (!x [2]&x [3])| (x [2]&x [3]) [[2]] [1](!x [2]&!x [1])| (!x [2]&x [1])| (x [2]&!x [1]) [[3]] [1](!x [2]&x [3])| (x [2]&!x [3]),我想將其結構轉換爲 [[1]] [1] function(x){(!x [2]&!x [3])| (!x [2]&x [3])| (x [2]&x [3])} [[2]] [1] function(x){(!x [2]&!x [1])| (!x [2]&x [1])| (x [2]&!x [1])} [[3]] [1] function(x){(!x [2]&x [3])| (x [2]&!x [3])}。希望這更清楚。 – user24318 2015-03-24 22:30:24

+0

感謝您的回答。我嘗試使用你列出的,但它給了我一個錯誤。可能是我沒有正確理解E < - function(x){eval(parse(text = paste(x,collapse =「」)))} wrapper < - function(s){E(「function(x){ 「),s,」}「)} > ListOfFunctions < - lapply(g,wrapper) E(」function(x){「,s,」}「)中的錯誤:未使用的參數(s,」}「) – user24318 2015-03-25 03:55:39

+0

您沒有使用正確的E()函數,該文章已在1小時前編輯過,因此請使用編輯過的文章重試。 – cmbarbu 2015-03-25 03:59:18

1

這被crossposted到Rhelp(以稍微不同的形式),其中Uwe Ligges offered the following solution

#One way: 

f <- function(x) x 
gfunc <- lapply(g, function(i) {body(f) <- parse(text=i); f}) 

# So now you have functions in your list gfunc and can call them via 

gfunc[[1]](c(0,0,0)) 

我使用上面,並將該溶液併成功提供的結構進行了測試。我不認爲他會介意在這裏重複這個。