基礎上所以在你的問題回答中提供:
library(shiny)
mymtcars = mtcars
mymtcars$id = 1:nrow(mtcars)
runApp(
list(ui = pageWithSidebar(
headerPanel('Examples of DataTables'),
sidebarPanel(
checkboxGroupInput('show_vars', 'Columns to show:', names(mymtcars),
selected = names(mymtcars))
),
mainPanel(
dataTableOutput("mytable")
)
)
, server = function(input, output, session) {
strd<-reactiveValues(tr=0, slrows=character(length=nrow(mymtcars)))
#preserve selected rows in a reactive element
rowSelect <- reactive({
input$rows
})
# use reactive value that's equal to 'checked' parameter for html code
observe({
strd$slrows<-ifelse(mymtcars$id %in% as.numeric(rowSelect()),'checked','')
})
#use observer for column checkboxinput to detect first run
observeEvent(input$show_vars, {
strd$tr<-strd$tr+1
print(strd$tr)
}, ignoreNULL = TRUE)
output$mytable = renderDataTable({
#if first run - nothing is checked
if (strd$tr==1){
addCheckboxButtons <- paste0('<input type="checkbox" name="row', mymtcars$id, '" value="', mymtcars$id, '" >',"")
} else{
# add 'checked' parameter for html depending if id is present in selected rows reactive value
addCheckboxButtons <- paste0('<input type="checkbox" name="row', mymtcars$id, '" value="', mymtcars$id,'" ',
strd$slrows,'>',"")
}
#Display table with checkbox buttons
(cbind(Pick=addCheckboxButtons, mymtcars[, input$show_vars, drop=FALSE]))
}, options = list(orderClasses = TRUE, lengthMenu = c(5, 25, 50), pageLength = 25),
escape=FALSE, callback = "function(table) {
table.on('change.dt', 'tr td input:checkbox', function() {
setTimeout(function() {
Shiny.onInputChange('rows', $(this).add('tr td input:checkbox:checked').parent().siblings(':last-child').map(function() {
return $(this).text();
}).get())
}, 10);
});
}")
}
)
)
類似,但DT方法:(多一點因爲您不會爲每行創建輸入,因此它不會爲每個反應值觸發器重新創建表(這是列和行的刻度)。它僅在列無效值觸發器中重新創建表。您還可以使用colvis
在按鈕推廣,以純DT解決方案相處
library(shiny)
library(DT)
mymtcars<-mtcars
shinyApp(
ui = pageWithSidebar(
headerPanel('Examples of DataTables'),
sidebarPanel(
checkboxGroupInput('show_vars', 'Columns to show:', names(mymtcars),
selected = names(mymtcars))
),
mainPanel(
verbatimTextOutput("selrows"),
DT::dataTableOutput("mytable")
)
),
server = function(input, output) {
strd<-reactiveValues(tr=0, slrows=c(0,0))
observe({
if(strd$tr==1){
strd$slrows<-0
} else strd$slrows<-input$mytable_rows_selected
})
rowSelect <- reactive({
input$mytable_rows_selected
})
observeEvent(input$show_vars, {
strd$tr<-strd$tr+1
print(strd$tr)
}, ignoreNULL = TRUE)
output$mytable = DT::renderDataTable({
datatable(mymtcars[, input$show_vars, drop=F], rownames=FALSE,options = list(pageLength = 10),
selection = list(mode='multiple', target='row',
selected = strd$slrows) )
}
)
output$selrows<-renderPrint({
input$mytable_rows_selected
})
}
)
閃亮的DT庫具有良好的使用rowselection沒有複選框,可能是更加有用。你也可以通過按鈕擴展來使用colvis過濾器,總的來說代碼會更有效率,所以如果有複選框並不是強制性的,那麼最好看看它。 – Asayat
1)小備註:應該添加'library(data.table)'。 2)FYI 運行你的代碼我得到的錯誤:''回調'參數只接受從R 3.4.0,閃亮1.0.3 JS()'返回的值。 (背景信息:我昨天也在這個問題上工作過,並且有一個非常類似的代碼,沒有超時fct(我爲什麼修復了錯誤)。最後一個問題對我來說,表更新了複選框,然後返回到初始狀態所以刪除選定的順序),....也許這是你的data.table方法修復的) – BigDataScientist
@BigDataScientist如果你使用DT庫,會發生錯誤。您應該分離DT包以運行此代碼。 正如我在評論中提到的,代碼基於問題代碼,即沒有DT選項。但是,使用DT和它的行選擇選項會更有效率,但是出於某種原因最好顯示GUI的複選框。 – Asayat