首页 > 解决方案 > 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">

标签: rggplot2

解决方案


您无权访问函数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()

在此处输入图像描述


推荐阅读