Shiny R触发器查询

时间:2018-01-31 23:51:34

标签: r shiny

嗨,我是新的闪亮和数据反应。我希望你能提供帮助,我有一个嵌入在observe函数中的查询,它响应来自DT :: renderDataTable()中唯一行选择的输入。当用户选择行时,向量递增,例如,行1被选中,然后行8,返回的向量是[1] 1 8.然后,值通过子集例程提供给查询,以将id作为文本字符串。即字符8与id" ch10"有关。 postgres查询一次只能获取1个值,但我希望在绘制所有选项之前将所有选择rbind放入数据帧中。我可以使用for循环执行此操作,但这不是非常有效且耗时。此外,每次迭代并更新绘图时,它再次循环遍历所有向量,并重新绘制所有选择加上新添加的内容。我需要做的是将新的矢量行添加到数据帧并验证id是否已经存在于数据帧中,如果已经存在则拒绝,或者如果它们不在那里则添加然后绘图,这可以在观察函数中完成吗?任何帮助将不胜感激。这是observe函数的主要代码:

       ids <- input$x3_rows_selected
       dat1 =  isolate(paste0(dat[ids, , drop = FALSE][[1]], sep = ""))

    if (dat1[1]=='')
       return(NULL)

      result = list()
    for (i in 1:length(dat1)){
      dat2           = dbGetQuery(con2, paste0("select * from    getsession('",dat1[i],"'),  sep=""))
      dat2$sessionid = dat1[i]
      result[[i]]    = dat2

    }

    big_data = do.call(rbind, result)

1 个答案:

答案 0 :(得分:0)

这是一个让您走上正轨的潜在解决方案。我稍微简化了一下,使用selectizeInput进行行选择,使用简单的子集语句而不是sql查询,但是这个想法/实现非常相似。

基本上,您可以添加两个reactiveVals;一个用于选定的行,一个用于表。然后,您可以创建observeEvent,以便在输入发生变化时对其进行调整。正如您在此解决方案中所看到的,行仅在选中时被提取一次,如果进行了新选择,则observeEvent会添加新行。这可以防止我们经常通过for循环。

library(shiny)

mtcars$id = seq(nrow(mtcars)) # add unique id

ui <- fluidPage(
  selectizeInput('input1','Select rows:',choices=seq(nrow(mtcars)),multiple=T),
  tableOutput('result')
)

server <- function(input,output)
{
  # initiate table with right column headers
  my_table <- reactiveVal(mtcars[0,]) 
  # initiate out selection
  selection <- reactiveVal()  

  observeEvent(input$input1, ignoreNULL = F,
               {
                 # if any from input1 not yet in our selection
                 if(any(!input$input1 %in% selection()))
                 {
                   to_add = input$input1[!input$input1 %in% selection()] # which id to add?
                   selection(c(selection(),to_add)) # update the reactiveVal
                   df_to_add = mtcars[mtcars$id==to_add,] # your sql query here
                   my_table(rbind(my_table(),df_to_add)) # update the table reactiveVal
                 }
                 else
                 {
                   # if there are rows selected that the user has deselected ...
                   if(any(!selection() %in% input$input1 ))
                   {
                     selection(input$input1) # set selection to the user input
                     # remove the deselected rows from the table
                     my_table(my_table()[my_table()$id %in% input$input1,] ) 
                   }
                 }
               })

  output$result <- renderTable({my_table()})

}
shinyApp(ui,server)

希望这有帮助!