我有一個布爾表達式列表,需要在隨機生成的起始點(數據矩陣行)進行求值。我想在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)
}
只是好奇你爲什麼使用noquote類 – 2015-03-25 02:02:41
上面給出的g只是一個玩具的例子。我所擁有的實際的g有超過50個這樣的字符串,並且是與上面具有相同結構的其他函數的結果。 – user24318 2015-03-25 03:43:08