如何在闪亮的应用程序中更新数据框中的输入值?

时间:2019-06-13 07:56:51

标签: r shiny

首先,我是新手,如果这是一个简单的问题,请原谅。按下按钮后,我将在数据集中更新输入数据。

我有两个文本输入(客户ID和客户的发生率)和两个选择器(月度第一付款和月度第二付款),我想使用闪亮的应用程序更新数据。我想按一下按钮后更新我的数据,这是问题所在。我不知道如何更新数据集中的输入。谁能帮我吗?

这是我的代码:

library(shiny)
client<-c("00001S000","00002S000","00003S000","00004S000","00005S000","00006S000","00007S000","00008S000","00009S000")
pagament_1 <- c("Gener","","Marc","Febrer","","","","Gener","")
pagament_2 <- c("Abril","","Maig","Febrer","","","","Marc","")
y<-data.frame(client,pagament_1,pagament_2)
y

ui <- fluidPage(
   titlePanel("CONTROL CLIENTS"),
   sidebarPanel((""),
                textInput("client","Codi Client:",""),
                selectInput("pagament_1","Pagament 1", choices = c("-",
                                                                   "Gener",
                                                                   "Febrer",
                                                                   "Marc",
                                                                   "Abril",
                                                                   "Maig",
                                                                   "Juny",
                                                                   "Juliol",
                                                                   "Agost",
                                                                   "Setembre",
                                                                   "Octubre",
                                                                   "Novembre",
                                                                   "Desembre")),
                selectInput("pagament_2","Pagament 2", choices = c("-",
                                                                   "Gener",
                                                                   "Febrer",
                                                                   "Marc",
                                                                   "Abril",
                                                                   "Maig",
                                                                   "Juny",
                                                                   "Juliol",
                                                                   "Agost",
                                                                   "Setembre",
                                                                   "Octubre",
                                                                   "Novembre",
                                                                   "Desembre")),
                textInput("incidencia","Escriu la incidencia:",""),
                actionButton("goButton","Actualitzar Client!")

),
      mainPanel((""),
                tableOutput("client"),
                dataTableOutput("df"),
                textOutput("client_"),
                textOutput("pag_1"),
                textOutput("pag_2"),
                textOutput("incidencia"),
                tableOutput("client_all"))

)

server <- function(input, output) {
  output$client_all <-renderTable(y) 
  output$client <- renderTable({
     stateFilter <- subset(y,y$client == input$client)
   })
  output$client_    <- renderText({paste("CODI CLIENT:",input$client)})
  output$pag_1      <- renderText(if(input$pagament_1 == "-"){
    print("PAGAMENT 1: Sense canvis")
  } else {paste("PAGAMENT 1:",input$pagament_1)})
  output$pag_2      <- renderText(if(input$pagament_2 == "-"){
    print("PAGAMENT 2: Sense canvis")
  } else {paste("PAGAMENT 1:",input$pagament_2)})
  output$incidencia <- renderText(if(input$incidencia == ""){
    print("INCIDENCIA: No s'ha modificat")
  } else { paste("INCIDENCIA MODIFICADA:",input$incidencia)})
  df <- eventReactive(input$goButton,{
      head(y,input$pagament_1)
    })
  data <- eventReactive(input$goButton == 1, {
    if (is.null(input$client)){
      return()
    }
    nr<- data.table(col1=input$client, col2=input$pagament_1, col3=input$pagament_2,
                     col4 = Sys.time(), col5 = input$incidencia)
    y <<-rbind(y,nr)
  })
}

shinyApp(ui = ui, server = server)

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

您对如何在Shiny中传递数据有一些普遍的误解:

y <<-rbind(y,nr)

我想您想将此数据rbind放在您在顶部创建的数据框中。但是,这种方式不起作用。您在eventReactive语句中创建第二个数据框。将此视为自己的世界。 “全局”世界不知道反应世界内部发生了什么,这就是为什么您不能将在reactiveeventReactive语句中创建的data.frame传递给“外部世界”的原因。

您要做的是这样的:

data <- eventReactive(input$goButton, {
    if (is.null(input$client)){
        return()
    }
    nr<- data.table(col1=input$client, col2=input$pagament_1, col3=input$pagament_2,
                    col4 = Sys.time(), col5 = input$incidencia)
    y <-rbind(y,nr)
    y
})

您可以通过单击按钮来创建此新的data.frame或data.table,但请不要在此处使用<<-运算符。当您单击按钮时,R会创建一个称为data的Promise,就像R中的普通变量一样。

output$client <- renderTable({
    stateFilter <- subset(data(),y$client == input$client)
})

您创建的Promise对象必须传递到反应性端点。这是渲染它的地方。您必须像编写普通函数一样通过编写data()而不是data来调用Promise。

这是将处理过的数据从一个地方传递到另一个地方的方式。但是,您的代码有一些错误,因此我无法直接对其进行修复(您尝试将5列的数据绑定到具有较少列的data.frame),但是您知道如何更改代码:-)