r - R中的函数do({})不允许我命名“ode”以便能够在ggplot映射中添加变量
问题描述
我在 R 中实现 SIR 模型,我需要为它改变 beta 和 gamma。
library(deSolve)
par(mar = rep(2, 4))
N = 1000
vi <- c(S = N-1,I = 1,R = 0)
SIR <- function(t, vi, pm) {
with(as.list(c(vi, pm)), {
ds <- -beta* S* (I/N)
di <- beta* S* (I/N) - gamma * I
dr <- gamma * I
return(list(c(ds, di, dr)))
})
}
t <- seq(0, 50, by = 1)
betavals <- c(1,5,8)
ipvals <- c(2,20,50)
gammavals <- 1/ipvals
但是,当想要为我的不同 Beta 和 gamma 值应用该函数时,该do ({})
函数不允许我将我的函数命名为“ode”,因此能够在 ggplot 中打印(aes (x = t, y = value )
I、S 和 R。
library(tidyverse)
expand.grid(beta=betavals,gamma=gammavals)%>%
group_by(beta,gamma) %>%
do(
{
ode(func=SIR,y=vi,times=t,
parms=c(beta=.$beta,gamma=.$gamma)) %>%
as.data.frame() -> out
}
) out %>%
gather(variable,value,-time)%>%
ggplot(aes(x=time,y=value,color=variable))+ #value is I,S,R
geom_line()+
facet_grid(beta~gamma,scales='free_y',labeller=label_both)+
theme_bw()
这样做时我收到此错误
<Error: unexpected symbol in:
" }
) out">
解决方案
您无权访问函数out
外部的变量do
。我们可以继续使用相同的链式操作来获取长格式的数据。gather
已经退役,所以我将其替换为pivot_longer
.
library(tidyverse)
library(deSolve)
expand.grid(beta=betavals,gamma=gammavals)%>%
group_by(beta,gamma) %>%
do(
{
ode(func=SIR,y=vi,times=t,
parms=c(beta=.$beta,gamma=.$gamma)) %>%
as.data.frame()
}
) %>%
ungroup %>%
pivot_longer(cols = S:R) %>%
mutate(name = factor(name, c('S', 'I', 'R'))) %>%
ggplot(aes(x=time,y=value,color=name))+
geom_line() +
facet_grid(beta~gamma,scales='free_y',labeller=label_both)+
theme_bw()
推荐阅读
- python - 自然语言处理 | 用于二元组的 LimeTextExplainer
- package - Julia 包开发:重启内核不会编译模块
- python - 使用 Selenium 和重置密码 TikTok(python)检测到
- mdx - 如何按两个维度成员过滤度量
- angular - 获取 ng-content 的原始/原始模板值
- elasticsearch - 如何在 Jelastic 上设置 elasticsearch 集群?连接被拒绝
- python - pynput 代码没有给我一个简单的字符串作为键
- tinymce - Tiny.Cloud 不添加域名
- javascript - resize-img module expected `buffer` to be of type `Buffer` but received type `object`. Logging argument returns buffer
- ruby-on-rails - Generic model that has many relationship depending on value of enum