参数意味着不同的行数。 data.frame() 错误

Arguments imply differing number of rows. data.frame() Error

这个问题与此相关:How to change column values from date format to free-flowing text is dependent on "result" column in R shiny

我想填充一些输入并将其添加到 shiny 应用程序中的数据表中。

这是我的代码:

基本上这段代码有效,但前提是我在 Date of the result / Remarks for fail

中有日期

如果我在 Date of the result / Remarks for fail 中使用空白字段启动应用程序并按下 ADD 按钮,应用程序将停止并给出错误:

Arguments imply differing number of rows. data.frame() Error
library(shiny)
library(tidyverse)
library(DT)
library(shinyjs)

ui <- fluidPage(
  shinyjs::useShinyjs(),
  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" )),
                                    dateInput("resultdate", 
                                              value = NA, 
                                              label = "Date of the result / Remarks for fail", 
                                              format = "yyyy-mm-dd"),
                                    textInput("remarks_fail", 
                                              label =  "Remarks for 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$result, {
    if(input$result == "FAIL"){
      shinyjs::disable("resultdate")
      shinyjs::enable("remarks_fail")
    } else {
      shinyjs::enable("resultdate")
      shinyjs::disable("remarks_fail")
    }
  })
  
  observeEvent(input$add,{
    new_entry <- data.frame(SCHOOLID=input$schoolId, 
                            USERID=input$userId, 
                            CLASS= input$class, 
                            RESULT=input$result,
                            RESULT_DATE = input$resultdate,
                            REMARKS_FAIL = input$remarks_fail)
    
    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")
    updateDateInput(session, "resultdate")
  })
  
  output$DT2 <- renderDT({
    store$value
  })
  
}

shinyApp(ui, server)

我如何修改它也适用于空日期字段的代码?

您可以使用 ifelse 处理 zero-length 条目:

observeEvent(input$add,{

  new_entry <- data.frame(
                  SCHOOLID=input$schoolId,
                  USERID=input$userId,
                  CLASS= input$class,
                  RESULT=input$result,
                  RESULT_DATE =as.Date(ifelse(length(input$resultdate)==0,NA_character_,input$resultdate),origin='1970-01-01'),
#...
}