我是编程的新手,特别是R.我发现有时比Matlab更容易获得更复杂的东西。我正在尝试重新创建一个我已经在“script.m”中拥有的循环但是我无法在R上获得任何内容。 有人可以解释一下如何运行以下三次吗?...
提前感谢您提供的任何帮助
pars <- c(...)
times <- seq(ti, tf, delta)
state <- c(S = 50, X = 20, P = 0.5)
SOLVE <- function(pars) {
derivs <- function(time, state, pars) {
with(as.list(c(state, pars)), {
.
.
.
return(list(c(St, Xt, Pt)))
})
}
return(as.data.frame(ode(y = state, times = times, func = derivs, parms = pars)))
}
for(i in seq(ti, tf-span, span)) {
times <- seq(i, i+span, delta)
out <- SOLVE(pars)
state <- c(state[1], tail(out[3], 1), tail(out[4], 1))
}
我得到的错误是:
checkInput出错(y,times,func,rtol,atol,jacfunc,tcrit,hmin,: `y'必须是数字
答案 0 :(得分:1)
评论太长了。试试:
state <- c(state[1], tail(out[[3]], 1), tail(out[[4]], 1))
您设置的方式,out
是一个data.frame。 out[3]
返回一个包含一列的data.frame。 tail(out[3],1)
返回一个包含一行和一列(但仍为data.frame)的data.frame。当您将这些组合使用时,例如
c(state[1],tail(out[3],1),...)
生成列表,而不是数字,这会导致错误。
如果您引用,例如out[[3]]
,则返回向量,哪些元素是out
的第三列。这是因为,在R中,data.frame根据定义是向量列表,因此out[[3]]
返回该列表中的第三个元素(向量)。