Dataframe 如何从Shining中的用户输入复选框创建反应式数据框和表

Dataframe 如何从Shining中的用户输入复选框创建反应式数据框和表,dataframe,checkbox,shiny,reactive,Dataframe,Checkbox,Shiny,Reactive,因此,基本上我正在尝试开发一个用户界面,在这个界面上,如果一个人在复选框中有疾病,他可以选择是或否。然后,它将为每个相应的疾病提供肯定/否定的答案,并创建一个数据框,以便可以呈现一个日期表,让患者可以看到他们的反应。我一直在努力尝试将复选框中单击的内容放入一个包含疾病的数据框中,我在编码中为这些疾病创建了另一个日期框。我尝试了几种方法,但现在它一直在说,当我尝试根据用户选择的内容创建数据帧时,找不到对象“data1”、“smoking”和“diabetes”。我的if/else语句似乎不起作用。

因此,基本上我正在尝试开发一个用户界面,在这个界面上,如果一个人在复选框中有疾病,他可以选择是或否。然后,它将为每个相应的疾病提供肯定/否定的答案,并创建一个数据框,以便可以呈现一个日期表,让患者可以看到他们的反应。我一直在努力尝试将复选框中单击的内容放入一个包含疾病的数据框中,我在编码中为这些疾病创建了另一个日期框。我尝试了几种方法,但现在它一直在说,当我尝试根据用户选择的内容创建数据帧时,找不到对象“data1”、“smoking”和“diabetes”。我的if/else语句似乎不起作用。下面是我的代码

library(shiny)
library(DT)

# Define UI for application that draws a histogram
ui <- fluidPage(

    # Application title
    titlePanel("IVD"),

    
    sidebarLayout(
        sidebarPanel(
            checkboxGroupInput("Diabete", "Diabetes:",
                              choices =  c("Yes" = "yes0",
                                 "No" = "no0")),
            checkboxGroupInput("Smoke", "Smoking:",
                               c("Yes" = "yes1",
                                 "No" = "no1"))),

        
        mainPanel(
            fluidRow(actionButton("button", "Click for Risk Prediction")),
            dataTableOutput("summary_table")
        )
    )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

 
observeEvent(input$button, { 
output$summary_table<-renderDataTable({
    a<- eventReactive(input$Diabete, {   
        if (input$Diabete == "yes0") {
            a=1
        } else {
            a=0
        }})
    b<- eventReactive(input$Smoke, {   
        if (input$Diabete == "yes1") {
            b=1
        } else {
            b=0
        }})
    ivd<-c('Diabetes','Smoking')
    #data<- c(11,10,sugar,8,7,6,5,4,3,2,1)
    values <- reactiveValues()
    values$ivd <- data.frame()
    eventReactive(input$Diabete, {
        diabetes <- a
        smoking <- b
        
        da <- data.frame(diabetes, smoking)
        
        data1 <- rbind(values$ivd, da)
    })
    ivd_data<-data.frame(ivd,data1,stringsAsFactors=FALSE )
    print(ivd_data)   
})
})
}

# Run the application 
shinyApp(ui = ui, server = server)
试试这个

# Define UI for application that draws a histogram
ui <- fluidPage(
  
  # Application title
  titlePanel("IVD"),
  
  
  sidebarLayout(
    sidebarPanel(
      checkboxGroupInput("Diabete", "Diabetes:",
                         choices =  c("Yes" = "yes0",
                                      "No" = "no0")),
      checkboxGroupInput("Smoke", "Smoking:",
                         c("Yes" = "yes1",
                           "No" = "no1"))),
    
    mainPanel(
      fluidRow(actionButton("button", "Click for Risk Prediction")),
      DTOutput("summary_table")
    )
  )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
  
  
  observeEvent(input$button, { 
    
    a<- eventReactive(input$Diabete, {   
      a = ifelse(input$Diabete == "yes0",1,0) 
      })
    
    b<- eventReactive(input$Smoke, {   
      b = ifelse(input$Smoke == "yes1",1,0) 
      })
    
    ivd<- data.frame(a='Diabetes',b='Smoking')
    
    data1 <- reactive({
      data <- rbind(ivd,data.frame(a=a(),b=b()))
    })
    
    output$summary_table <- renderDT(data1())
    
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

非常感谢@YBS!是的,这很有效!第二个问题,我看到ifelse语句是为两个选项1和0设置的。如果您有两个以上的选项,您将如何设置它?例如1,2,4,5。有很多方法可以做到这一点。最简单的方法是做你们在OP中所做的,也就是说,if{…}else if{…}else if{…}依此类推。如果您能够管理,嵌套的ifelse可以相当容易地完成。您还可以尝试case_when、array、sqldf等。