在 R Shiny 中使用观察的无限循环

Infinite loop with observe in R Shiny

提问人:Clément Raspail 提问时间:10/22/2023 更新时间:10/22/2023 访问量:42

问:

我试着对植物列表进行选择的模拟。这是我在 R 中使用 lib Shiny 的代码:

server <- function(input, output) {
  n_pop <- reactiveVal()
  tab <- reactiveVal()
  
  S <- 0.5
  avantage_eau <- 1.1
  generation <- 0
  generation_max <- 10

  phenotype <- c("AB", "Ab", "aB", "ab")

  #Constructeur
  creer_plante <- function(type, age) {
    plante <- list(type = type, age = age)
    class(plante) <- "plante"
    return(plante)
  }

  #Getteurs
  get_type <- function(plante) {
    return(plante$type)
  }

  get_age <- function(plante) {
    return(plante$age)
  }

  #Affichage
  afficher_pheno_plantes <- function(tableau) {
    pie(table(sapply(tableau, get_type)))
  }

  afficher_age_plantes <- function(tableau) {
    pie(table(sapply(tableau, get_age)))
  }


  #Fonction
  vieillir <- function(plante) {
    return(creer_plante(get_type(plante), get_age(plante) + 1))
  }
  

  selection_nat <- function(tableau){
    tab_temp <- list()
    for (i in 1:n_pop()) {
      if (grepl("B", get_type(tableau[[i]]))) {
        if (runif(1) < S * avantage_eau) {
          tab_temp <- append(tab_temp, list(vieillir(tableau[[i]])))
        }
      } else {
        if (runif(1) < S) {
          tab_temp <- append(tab_temp, list(vieillir(tableau[[i]])))
        }
      }
    }
    return(tab_temp)
  }

  creation_tab <- function() {
    tab_temp <- list()
    for (i in 1:n_pop()) {
      nouvelle_plante <- creer_plante(phenotype[sample(1:4, 1)], 0)
      tab_temp <- append(tab_temp, list(nouvelle_plante))
    }
    return(tab_temp)
  }

  observe({
    n_pop(input$n)
    tab(creation_tab())

    t <- tab()
    while (generation < generation_max) { 
      # t <- selection_nat(t)
      n_pop(length(t))
      if (n_pop() == 0) {
        break
      }
      generation <- generation + 1
      
    }
    tab(t)
  })

  output$distPlot <- renderPlot({
    par(mfrow = c(2, 1))
    afficher_age_plantes(tab())
    afficher_pheno_plantes(tab())
    # cat(length(tab()), "plantes vivantes\n")
  })
}

我在观察中注释了 (# t <- selection_nat(t)) 中的行,因为我进入了无限循环。 在这里,我尝试将我的选择功能应用于 t 或 tab() 中的值 containe。

如果有人知道如何帮助我。谢谢 <3

R 闪亮 无限循环

评论

1赞 phili_b 10/23/2023
当您使用时,会观察到每个反应变量。因此,如果你不注意事件和反应变量之间的关系,那么循环一个变量和另一个变量等是正常的。尝试。从 Shiny 1.6.0 开始,有 .即便如此,有时您还必须避免使用 .observe({})observeEvent( c( reactvar1, reactvar2) ),{ bla bla})bindEventisolate()
1赞 phili_b 10/23/2023
在 的每一步,反应变量 和 都会更新,因此它们会一次又一次地触发。whilen_poptabobserve()

答: 暂无答案