繁体   English   中英

在Shiny应用程序中,如何暂停for循环以获取用户输入,然后在单击按钮后继续?

[英]In a Shiny app, how can I pause a for loop to grab a user input, then continue after a button click?

我正在编写一个能够模拟各种草稿的闪亮应用,其中用户将在模拟选择(随机选择)之间的列表中进行选择。 为了更好地解释前提,我们从12个选择列表开始。 当“插槽”出现时,用户将选择这些选项之一。 因此,如果他们选择“ 4”作为自己的广告位,则前3个选择将被随机模拟。 然后,用户将做出他们的选择,并且将随机模拟最后的8个选择...每当做出选择时,该选择就会从列表中删除。 因此,每个选择只能被选择一次。

因此,我需要遍历数字1-12,并随机模拟该选择,或者(如果是用户的话)允许通过用户输入进行选择。

在用户做出选择之前,我还没有弄清楚如何暂停循环,然后在单击按钮进行确认之后继续操作。 下面是我的最小可重现示例的代码。 照原样,由于循环不会暂停,因此用户实际上已被跳过。

new_list<-c()

choice_list<-c("Choice 1","Choice 2","Choice 3","Choice 4",
               "Choice 5","Choice 6","Choice 7","Choice 8",
               "Choice 9","Choice 10","Choice 11","Choice 12")

ui<-navbarPage(title="Title", id="navbar",
  tabPanel("Main",
    selectInput(inputId="slot", label="Select your Slot", choices=1:12),
    actionButton(inputId="start", label="Start Process"),
    fluidRow(hr()),
    selectInput(inputId="user_choice", label="Choose an Option", choices=choice_list),
    actionButton(inputId="selection", label="Make Selection"))
)

server<-function(input, output, session) {
  observeEvent(input$start, {
    user_slot<-isolate(input$slot)
    print(paste0("User slot: ",user_slot))
    print("----------")
    print("----------")
    for (i in 1:12) {
      if (i==user_slot) {
        print("TIME FOR USER SELECTION")
        observeEvent(input$selection, {
          user_choice<-isolate(input$user_choice)
          print(paste0("User choice: ",user_choice))
          new_list<-c(new_list,user_choice)
          choice_list<-choice_list[choice_list!=user_choice]
        })
      } else {
        random_number<-sample(seq(1:length(choice_list)),1)
        print(paste0("Random number: ",random_number))
        random_choice<-choice_list[random_number]
        print(paste0("Random choice: ",random_choice))
        new_list<-c(new_list,random_choice)
        choice_list<-choice_list[choice_list!=random_choice]
      }
      print(paste0("# of choices left: ",length(choice_list)))
      print("----------")
    }
  })
}

shinyApp(ui=ui, server=server)

有没有一种方法可以暂停循环,但是在触发“ observeEvent()”时允许循环继续? 是否有替代“ observeEvent()”的方法可以解决此问题? 还是我需要重新设计具有不同循环过程的解决方案?

提前致谢!

我认为您无法在循环中观察到事件,但我遇到了完全相同的问题,并尝试使用Sys.sleep()和while循环将其暂停,以等待用户输入,该用户输入将更改值以中断循环,但确实如此不行。

我认为最简单的解决方案是将您的代码分成几部分:循环所在的函数,当它是用户的插槽时,循环中断,并且该函数返回要进行的其余选择。 当用户选择他的选择时,将以剩余的选择数量重新开始循环。

server<-function(input, output, session) {
  values <- reactiveValues(
    n = 12
  )

  observeEvent(input$selection, {
    user_choice<-isolate(input$user_choice)
    print(paste0("User choice: ",user_choice))
    new_list<-c(new_list,user_choice)
    choice_list<<-choice_list[choice_list!=user_choice]
    print(paste0("# of choices left: ",length(choice_list)))
    print("----------")

    loop(0, values$n)

  })

  observeEvent(input$start, {
    user_slot<-isolate(input$slot)
    print(paste0("User slot: ",user_slot))
    print("----------")
    print("----------")

    values$n <- loop(user_slot)
  })
}

loop <- function(user_slot, n = 12){
  for (i in 1:n) {
    if (i==user_slot) {
      print("TIME FOR USER SELECTION")
      break
    } else {
      random_number<-sample(seq(1:length(choice_list)),1)
      print(paste0("Random number: ",random_number))
      random_choice<-choice_list[random_number]
      print(paste0("Random choice: ",random_choice))
      new_list<-c(new_list,random_choice)
      choice_list<<-choice_list[choice_list!=random_choice]
    }
    print(paste0("# of choices left: ",length(choice_list)))
    print("----------")
  }
  return(n-i)
}

如果您找到其他解决方案,请告诉我

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM