我对评估表达式的环境有疑问。具体来说,我有一个函数bnlearn :: cpdist,它将逻辑表达式作为参数。我希望使用一个变量来指定该参数,所以我希望使用eval(parse(text = string))。但是,如果这种情况发生在较大函数的环境中,则eval函数无法找到变量“string”,尽管它已在该环境中定义。我很迷惑。以下是重现问题的代码。
# The function is from the bnlearn package, which handles Bayesian networks
library(bnlearn)
#Example data
data(learning.test)
#Fitting a model
fitted = bn.fit(hc(learning.test), learning.test)
#The function in question generates samples from the PDF of one node given the values of others.
posterior = cpdist(fitted, "D", (A == "a" & C == "b")) #Notice the awkward logical statement arg
prop.table(table(posterior))
#I want to use character variables instead of the logical statement.
#If I use parse and eval to specify the logical statement I have no issues.
evidence.nodes <- c("A", "C")
evidence.values <- c("a", "b")
ev <- paste("(", evidence.nodes, "=='",
sapply(evidence.values, as.character), "')",
sep = "", collapse = " & ")
posterior <- cpdist(fitted, "D", eval(parse(text = ev)))
#But what I want to do is apply do this from within a function
getPosterior <- function(fitted, target, ev.nodes, ev.values){
ev <- paste("(", ev.nodes, "=='",
sapply(ev.values, as.character), "')",
sep = "", collapse = " & ")
posterior <- cpdist(fitted, "D", eval(parse(text = ev)))
prop.table(table(posterior))
}
#Here is where the problem lies. The following works if "ev" is already defined as it was above. However, if you remove ev from the global environment, then it fails. I do not understand why it cannot find the ev object defined within the function's environment.
new.data <- data.frame(A = c("a", "b", "a", "b"), C = c("a", "a", "b", "b"))
rm(ev)
for(i in 1:nrow(new.data)){
print(getPosterior(fitted, "D", names(new.data), new.data[i, ]))
}
答案 0 :(得分:0)
我遇到了这样的问题。我通过对函数中未找到的变量进行超级分配解决了该问题。
var <<- 5