R

时间:2015-10-01 15:19:43

标签: r

我是编程的新手,特别是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'必须是数字

1 个答案:

答案 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]]返回该列表中的第三个元素(向量)。