R Shiny isolate()以整数形式返回日期

时间:2018-01-06 09:09:25

标签: r shiny

我正在尝试创建一个向现有数据框添加行的输入表单。 我使用了here描述的方法。

我遇到的问题是我有两个日期输入类型,使用此代码转换为整数。

以下是一些示例数据:

x_df <- data.frame(title = character(1), start = character(1), end = character(1))
x$title <- "Test1"
x$start <- as.Date("2017-12-16")
x$end <- as.Date("2017-12-17")

我的代码:

library(shiny)

runApp(
list(
ui = fluidPage(

  sidebarLayout(

    sidebarPanel(

      selectInput("Employee", "Choose an employee:",
                  choices_employee),

      dateInput("Date_from", "From:", format = "yyyy/mm/dd"),

      dateInput("Datum_until", "Until:", format = "yyyy/mm/dd"),

      actionButton("Add", "Add")

    )
  )
),

server = function(input, output) {

  values <- reactiveValues()
  values$df <- x_df
  addData <- observe({

    # your action button condition
    if(input$Add > 0) {
      # create the new line to be added from your inputs
      newLine <- isolate(c(input$Employee, input$Date_from, input$Date_until))
      # update your data
      # note the unlist of newLine, this prevents a bothersome warning message that the rbind will return regarding rownames because of using isolate.
      values$df <- isolate(rbind(as.matrix(values$df), unlist(newLine)))
      x_df <<- as.data.frame(values$df)
    }
  })

}
)
)

我认为isolate()正在将日期转换为整数,任何人都知道如何才能使这项工作成功?任何帮助是极大的赞赏。如果我的问题不够明确,请告诉我,我会尽力改进。

谢谢!

1 个答案:

答案 0 :(得分:0)

OP的帖子中的代码无效。因此,将其更改为使用renderDataTable包中的DT获取输出。此外,更改了as.matrixunlist,这可能会在存在混合类列时更改列类型。例如,

unlist(as.list(Sys.Date() + 0:5))
#[1] 17537 17538 17539 17540 17541 17542

更正后的代码位于

之下
library(DT)
library(shiny)

runApp(
  list(
    ui = fluidPage(


      sidebarLayout(

        sidebarPanel(

          selectInput("Employee", "Choose an employee:",
                      choices_employee),

          dateInput("Date_from", "From:", format = "yyyy/mm/dd"),

          dateInput("Date_until", "Until:", format = "yyyy/mm/dd"),

          actionButton("Add", "Add")

        ),
        mainPanel(
          dataTableOutput("table")
        )
      )


    ),

    server = function(input, output) {

      values <- reactiveValues()
      values$df <- x_df
      addData <- observe({


        if(input$Add > 0) {
          # create the new line to be added from your inputs
          newLine <- isolate(data.frame(title = input$Employee, start = as.Date(input$Date_from),
                                          end = as.Date(input$Date_until), stringsAsFactors= FALSE))

          values$df <- isolate(rbind(values$df, newLine))


        }
      })

      output$table <- renderDataTable({values$df })

    }
  )
)

-output

enter image description here

数据

x_df <- data.frame(title = character(1), start = character(1), end = character(1))
x_df$title <- "Test1"
x_df$start <- as.Date("2017-12-16")
x_df$end <- as.Date("2017-12-17")
choices_employee = LETTERS[1:5]