嗨,我是新的闪亮和数据反应。我希望你能提供帮助,我有一个嵌入在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)
答案 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)
希望这有帮助!