使用watchEvent更新data.frame

时间:2019-02-04 15:42:27

标签: r

人们!

如果我具有以下数据框:

observeEvent(input$pesquisa,{

    query <- glue(
      "select 
      cod_ordem_producao as ORDEM,
      dim_ext_tubo as DIAMETRO,
      esp_par_tubo as PAREDE,
      cod_aqa as AQA,
      tmo_ciclo_plan as CICLO,
      dth_criacao_reg as DATA,
      dsc_aco as GRAU,
      val_lim_escoamento as LE,
      val_tensao_residual as TR
      from
      QT_QTS.PLA_ORDEM_PRODUCAO
      where DIM_EXT_TUBO = {as.numeric(input$diametro)}
      and esp_par_tubo = {as.numeric(input$parede)}
      and tmo_ciclo_plan = {as.numeric(input$ciclo)}
      and dth_criacao_reg between DATE '{as.character(input$dates[1])}' and DATE '{as.character(input$dates[2])}'
      and VAL_LIM_ESCOAMENTO != 0
      order by DTH_CRIACAO_REG desc")

    df <- dbGetQuery(
      connection_reportUser,
      query
    )    

    df    <-------------- HERE IS THE SAVED VALUES TO THE DATA FRAME---------------
    valor_grau <- df$GRAU
})

接下来,我使用另一个observeEvent:

observeEvent(input$pesquisa, {

      insertUI(
        selector = "#pesquisa",
        where = "afterEnd",
        ui = selectInput(
          "grau",
          label = "Grau:",
          choices = valor_grau
        )
      )
    })

说明: 我在数据库中搜索这些值并将其保存到data.frame(称为“ df”)中。当我搜索时(使用输入的内容并单击“ pesquisa”按钮),将为用户显示一个名为“ Grau:”的新字段,其中包含新的可选值。

如何使用第二个输入中的值更新“ df”? (在这种情况下,来自“ insertUI”的输入称为“ Grau:”

----------------已编辑------------------------

在我的UI代码中,我有一个:DT::dataTableOutput("contents2")

在服务器端,我有:

output$contents2 = DT::renderDataTable({
      tabela_saida})

我的第一个watchEvent是上面描述的事件,然后保存到我的 df 中,我有一个:

tabela_saida = df

第二个observeEvent应该更新我的 tabela_saida 中名为GRAU的值。 第三次observEvent应该更新 AQA ...,依此类推。

最后,应该公开使用所有新值更新的datable,并在我的数据库中进行搜索。

1 个答案:

答案 0 :(得分:0)

我认为您想根据条目(data.frame)更新grau。为此,您可以创建一个eventReactive来执行查询。在eventReactive中,您需要检查用户是否已经在input$grau中选择了某些内容。

这是一种实现方法:

library(shiny)
library(DT)

ui <- fluidPage(
  mainPanel(
    actionButton(inputId = "pesquisa", label = "pesquisa"),
    conditionalPanel(condition = "input.pesquisa > 0", uiOutput("grau")),
    DT::DTOutput("contents2")
  )
)

server <- function(input, output) {

  create_df <- eventReactive(input$pesquisa,{

    ## Your query about here
    ## ...
    ##

    df <- data.frame(x = round(rnorm(100), 2), grau = rpois(100, lambda = 10))
    grau_values <- unique(df$grau)

    if(!is.null(input$grau)){
      grau_input <- input$grau

      df <- subset(df, grau %in% grau_input)
    } 

    return(list(df = df, grau_values = grau_values))
  })

  output$grau <- renderUI({
    grau_values <- create_df()$grau_values

    selectInput(inputId = "grau", label = "Grau:", multiple = TRUE, choices = grau_values, selected = NULL)
  })

  output$contents2 <- DT::renderDataTable({
    df <- create_df()$df

    datatable(df, rownames = FALSE)
  })
}

shinyApp(ui = ui, server = server)

我希望它能起作用!