我正在开发R闪亮应用程序。我已经在Shiny中创建了Tab1和Tab2,我试图做的是使数据表在";表2";一旦我填写了以下表格并点击";添加";按钮
摘要
当用户在";SchoolId,UserId,类,结果"在Tab1中点击";添加";按钮;表2";应该出现。
而且一旦用户按下";添加";按钮,字段";学校ID,"UserId;等等应该是空的、准备好供用户填写"0"中第二行的数据;表2";
问题:
我确信我在这里遗漏了为";添加";按钮,因为我无法填写Tab2中第二行的详细信息,因为";添加";按钮不工作。
有人能帮忙解决这个问题吗?
library(shiny)
library(shinyBS)
library(stringr)
library(Hmisc)
library(rhandsontable)
library(shinydashboard)
library(DT)
library(V8)
ui <- fluidPage(
fluidRow(tabsetPanel(id='tabs'
, tabPanel("Tab1", uiOutput("tabP1"))
, tabPanel("Tab2", uiOutput("tabP2"))
)
)
)
server <- function(input, output, session) {
output$tabP1 <- renderUI({
tabPanel("Tap1"
, div(id = "form"
, textInput("schoolId *", label="SchoolId" )
, selectInput("userId", label="UserId"
, choices = list("UserA" = "UserA", "UserB" = "UserB",
"UserC" = "UserC")
, selected = "UserA")
, textInput("class", value = NA, label = "class")
, selectInput("result", label="result"
, choices = list("PASS" = "PASS", "FAIL" ="FAIL" ), selected = "")
)
, actionButton("add", "Add")
)
})
# -------------------- Tab2 ----------------------------------
observeEvent(input$add,{
req(input$schoolId,input$userId,input$class,input$result)
tmp<-data.frame(SCHOOLID=input$schoolId, USERID=input$userId
, CLASS= input$class
, RESULT=input$result
)
df <- rbind(df,tmp)
})
output$DT2 <- DT::renderDataTable({
df
})
output$tabP2 <- renderUI({
tabPanel("View"
, DT::dataTableOutput("DT2")
, hr()
, hidden(downloadButton('downloadData', 'Download'))
)
})
}
shinyApp(ui, server)
对于可以反复更改的值,您希望使用类似reactive
或reactiveValues
的东西。要隐藏表格直到单击某个按钮,请根据按钮的输出使用conditionalPanel
(它显示单击了多少次(。
我已经在下面的代码中实现了这些东西:
编辑:回复你的第一条评论以及
library(shiny)
library(stringr)
library(shinydashboard)
library(tidyverse)
library(DT)
ui <- fluidPage(
fluidRow(tabsetPanel(id='tabs',
tabPanel("Tab1",
div(id = "form",
textInput("schoolId", label="SchoolId *" ),
selectInput("userId", label="UserId", choices = c("UserA", "UserB", "UserC"),selected = "UserA"),
textInput("class", label = "class"),
selectInput("result", label="result", choices = c("PASS", "FAIL" ))
),
actionButton("add", "Add")
),
tabPanel("Tab2",
tabPanel("View",
conditionalPanel("input.add != 0",
DTOutput("DT2"), hr(), downloadButton('downloadData', 'Download'))
)
)
)
)
)
server <- function(input, output, session) {
store <- reactiveValues()
observeEvent(input$add,{
new_entry <- data.frame(SCHOOLID=input$schoolId, USERID=input$userId
, CLASS= input$class
, RESULT=input$result)
if("value" %in% names(store)){
store$value<-bind_rows(store$value, new_entry)
} else {
store$value<-new_entry
}
# If you want to reset the field values after each entry use the following two lines
for(textInputId in c("schoolId", "class")) updateTextInput(session, textInputId, value = "")
updateSelectInput(session, "userId", selected = "UserA")
updateSelectInput(session, "result", selected = "PASS")
})
output$DT2 <- renderDT({
store$value
})
}
shinyApp(ui, server)