據我所知,eval(parse())
速度慢,經常會導致調試問題。但是,有沒有適合或甚至有必要使用eval(parse())
的情況?何時適合使用eval(parse())?
我有一個例子,下面我使用eval(parse())
。我試圖解決一個ODE系統,其中模型定義是從用戶輸入設置的,並被粘貼在一個函數中,如diffeqns
所示。參數是從包括解ODE的最優化步驟獲得的。因此,eval(parse())
將被評估很多次。在這種情況下,我如何避免eval(parse())
?
library(deSolve)
diffeqns <- structure(c("d_ParentW = - k_ParentW_to_sink * ParentW - k_ParentW_to_ParentS * ParentW - k_ParentW_to_MetW * ParentW + k_ParentS_to_ParentW * ParentS",
"d_ParentS = - k_ParentS_to_sink * ParentS + k_ParentW_to_ParentS * ParentW - k_ParentS_to_ParentW * ParentS - k_ParentS_to_MetS * ParentS",
"d_MetW = - k_MetW_to_sink * MetW + k_ParentW_to_MetW * ParentW - k_MetW_to_MetS * MetW + k_MetS_to_MetW * MetS",
"d_MetS = - k_MetS_to_sink * MetS + k_ParentS_to_MetS * ParentS + k_MetW_to_MetS * MetW - k_MetS_to_MetW * MetS"
), .Names = c("ParentW", "ParentS", "MetW", "MetS"))
mod_vars <- c("ParentW", "ParentS", "MetW", "MetS")
odeini <- structure(c(103.5304, 0, 0, 0), .Names = c("ParentW", "ParentS",
"MetW", "MetS"))
odeparms <- structure(c(0.0075920556751397, 109.831812097509, 0.00547432996880228,
0.067528800735385, 0.40912980024133, 0.512110576238725, 93.2375019578296,
1.48218125815231e-06, 312.228302990933, 255.11871122468), .Names = c("k_ParentW_to_sink",
"k_ParentS_to_sink", "k_MetW_to_sink", "k_MetS_to_sink", "k_ParentW_to_ParentS",
"k_ParentW_to_MetW", "k_ParentS_to_ParentW", "k_ParentS_to_MetS",
"k_MetW_to_MetS", "k_MetS_to_MetW"))
## experimenting Scripts for cleaner coding!
DefDiff <- function(time, state, parms,mod_vars,diffeqns) {
## an updated version of mkindiff
## @example DefDiff(t,state,parms, mod_vars, diffeqns=mkinmodini$diffs)
diffs <- vector()
for (box in mod_vars)
{
diffname <- paste("d", box, sep="_")
diffs[diffname] <- with(as.list(c(time,state, parms)),
eval(parse(text=diffeqns[[box]])))
}
##https://stat.ethz.ch/pipermail/r-sig-dynamic-models/2010q2/000031.html
#bady <- (!is.finite(diffs))|(diffs<=0)
#diffs[bady] <- 0
return(list(c(diffs)))
}
diff1 <-function(time, state, parms){
DefDiff(time, state, parms,mod_vars=mod_vars,diffeqns=diffeqns)
}
outtimes <- seq(0,100,1)
out <- ode(
y = odeini,
times = outtimes,
func = diff1,
parms = odeparms)
matplot(out)
更新時間:
我試圖想如何使用
substitue
代替parse
,但我擔心,我需要重寫,我已經寫使其真正大量的代碼工作。這裏是link我再次認爲
eval(parse())
是難以避免的。
你能指定它們在公式接口而不是字符串嗎? – Thomas
@Thomas,我不確定我是否理解你的建議。對於簡單的情況,我可以寫'y〜Y_0 * exp(-k(t))'。但我不能寫下這個程序遇到的所有情況。 – Zhenglei
或者我可以寫'y〜fo(P)'。但'fo()'又包含'eval(parse())'構造。 – Zhenglei