0

我正在编写一个应用程序,用于将纸质表格中的数据输入 SQL 数据库。数据来自野生动物捕获记录,会进入一个表,所以不同的表格有很多相同的字段(例如体重,年龄,物种等),但有些表格有不同的字段,或者相同字段以不同的顺序。我不想让未使用的字段可见,并且我希望 Shiny 应用程序与数据表上的字段顺序相匹配,以便用户可以通过 Tab 键浏览。所以,我有一个uiOutput基于最初从菜单中选择的物种呈现的每个物种。然后,在这些uiOutputs 中,其他输入,包括selectInput选择取决于所选物种的 s。

由于许多字段是相同的,我只想在最后有一个使用所有输入的数据框,无论选择的物种是什么,而不是熊数据框、麋鹿数据框等。所以,input$Age将被渲染多次而不是input$bearAgeinput$elkAge每次渲染一次。然后,最终,我将有一个数据框entrydata <- data.frame(Age = input$Age),而不是bearentrydata <- data.frame(Age = input$bearAge),elkentrydata <- data.frame(Age = input$elkAge)等。

问题是,闪亮似乎真的不喜欢一遍又一遍地使用相同的输入值,它会随机停止识别input$Age物种 1 的新值,然后再次开始识别物种 2,然后再次识别物种 1。我把里面有一个打印语句observeEvent(input$Age, {})来测试。我试图用 修复它choices = someAgeVector,其中someAgeVector更新observeEvent(input$GameID,{})和相同的事情发生,让我相信重复使用相同的 inputId 是一个问题。

有没有办法多次渲染相同的输入?

这是该应用程序的简化版本:

library(shiny)

game <- c('', 'Black_Bear', 'Elk', 'Mule_Deer')

## age class data frame
ages <- read.table(header = T, text = "
    Age_Class     Game
    Cub           Black_Bear
    Yearling      Black_Bear
    Subadult      Black_Bear
    Adult         Black_Bear
    6mo           Elk
    Yearling      Elk
    2-9yr_old     Elk
    10-14yr_old   Elk
    >15yr_old     Elk
    Neonate       Mule_Deer
    Fawn          Mule_Deer
    Yearling      Mule_Deer
    Adult         Mule_Deer
    Unknown       Mule_Deer
")
ui <- fluidPage(
  
  selectInput(inputId = 'GameID', label = 'Game', choices = game),
  
  uiOutput(outputId = 'bearUI'),
  uiOutput(outputId = 'elkUI'),
  uiOutput(outputId = 'deerUI'),
)

server <- function(input, output, session) {
  
  observeEvent(input$Age, {
    print(input$Age)
  })
  
  output$bearUI <- renderUI({
    req(input$GameID == 'Black_Bear')
    selectInput(inputId = 'Age', label = 'Age', choices = c(ages[ages$Game == input$GameID,]$Age_Class))
  })
  
  output$elkUI <- renderUI({
    req(input$GameID == 'Elk')
    selectInput(inputId = 'Age', label = 'Age', choices = c(ages[ages$Game == input$GameID,]$Age_Class))
  })
  
  output$deerUI <- renderUI({
    req(input$GameID == 'Mule_Deer')
    selectInput(inputId = 'Age', label = 'Age', choices = c(ages[ages$Game == input$GameID,]$Age_Class))
  })
  
}

shinyApp(ui = ui, server = server)
4

1 回答 1

1

每个@MrFlick:ID 在页面上必须是唯一的。这是因为它们实际上是作为节点上的 HTML id 属性实现的。Web 浏览器不能很好地处理重复的 ID。为了获得更好的策略,请尝试类似闪亮的模块,您可以在其中“命名空间”元素,这样您就不会有冲突的 ID。

于 2021-09-21T18:39:29.180 回答