Я пытаюсь решить ряд начальных условий перестановок для ODE, используя purrr.
В кадре данных хранится следующая информация.
library(tidyverse)
library(deSolve)
flow.data <- tibble(Unit=c(rep("MSS",times=11),rep("CS",times=3)),
Size=c(400,750,1200,1600,2400,3000,3600,4500,
6000,7200,10000,(1700*60/500),(4000*60/500),
(6600*60/500)),
Product=Size/60*3.786,
Feed=Product*.85,
Blowdown=Feed*.15,
Vol=c(74,106,163,275,353,492,603,
772,1340,1417,1800,7,18,26),
Ca=c(rep(10000,n=14))
)
Я настроил решение ODE следующим образом, и оно работает, когда я подключаю переменные:
odefunction <- function(h,q,ca,v){
g <- .5 #L/min
h <- h*3.785 #Feed gal/min converted to L/min
q <- q*3.785 #Blowdown gal/min converted to L/min
v <- v*3.785 #Vol gal converted to L
parameters <- c(h=h,q=q,v=v,f=ca)
state <- c(ca=0)
times <- seq(0,50,by=1)
funs <- function(t,state,parameters) {
with(as.list(c(state,parameters)),{
dca <- (h*f/v)-(q*ca/v)
list(c(dca))
})
}
out <- ode(y=state,times=times,func=funs,parms=parameters)
}
Например,
res <- odefunction(118,18,10000,1370)
производит:
> head(res)
time ca
[1,] 0 0.0000
[2,] 1 855.6803
[3,] 2 1700.1916
[4,] 3 2533.6797
[5,] 4 3356.2886
[6,] 5 4168.1601
Я пытаюсь получить результаты, используя pmap (из purrr), чтобы сопоставить список с функцией.
test <- pmap(list(flow.data$Feed,flow.data$Blowdown,flow.data$Ca,flow.data$Vol),odefunction(h,q,ca,v))
Я ожидаю получить вложенную таблицу с решением ODE для строки, используя flow.data, у меня будет:
MSS 400 25.2 21.5 3.22 74 10000 tibble...
Что я получаю:
Error: Can't convert a `deSolve` object to function
Call `rlang::last_error()` to see a backtrace
<error>
message: Can't convert a `deSolve` object to function
class: `rlang_error`
backtrace:
-purrr::pmap(...)
-purrr:::as_mapper.default(.f, ...)
-rlang::as_closure(.f)
-rlang::as_function(x, env = env)
-rlang::coerce_type(...)
-rlang:::abort_coercion(.x, .to)
Call `summary(rlang::last_error())` to see the full backtrace
Есть мысли о том, что я делаю не так?