我正在编写一个应用程序,用于将纸质表格中的数据输入 SQL 数据库。数据来自野生动物捕获记录,会进入一个表,所以不同的表格有很多相同的字段(例如体重,年龄,物种等),但有些表格有不同的字段,或者相同字段以不同的顺序。我不想让未使用的字段可见,并且我希望 Shiny 应用程序与数据表上的字段顺序相匹配,以便用户可以通过 Tab 键浏览。所以,我有一个uiOutput
基于最初从菜单中选择的物种呈现的每个物种。然后,在这些uiOutput
s 中,其他输入,包括selectInput
选择取决于所选物种的 s。
由于许多字段是相同的,我只想在最后有一个使用所有输入的数据框,无论选择的物种是什么,而不是熊数据框、麋鹿数据框等。所以,input$Age
将被渲染多次而不是input$bearAge
,input$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)