0
以下の例では、私は3を持っていますDT::datatables
。私は、ユーザーがこれらすべてのテーブルから複数の行を選択できないようにしたい。その後、documentationの「既存のDataTablesインスタンスを操作する」セクションのとおり、dataTableProxy
とselectRow
を使用します。それはうまく動作します。Shiny - DT - いくつかのDT:テーブル間での単一行の選択
私のアプリケーションでは、私は24(その値を呼び出すN
)テーブルがあります。下のコードを24個のテーブルページに適用しようとすると、恐ろしい数のコード行が発生します。
これを行うにはどのようなスマートな方法がありますか?特に
、どのように私はすることができます
- は、動的にオブザーバーを宣言? (ユーザーが回答した5029763)
- 最後にクリックされたテーブル(行ではない)を知っていますか? (すなわち再
reactiveText()
を書く方法。?)
EDIT:私は以下のコードで(下記参照)user5029763の答えにコピーされました。
DTWrapper <- function(data, pl = 5, preselec = c()){
datatable(data,
options = list(pageLength = pl, dom='t',ordering=F),
selection = list(mode = 'single', selected= preselec),
rownames = FALSE)
}
resetRows <- function(proxies, self){
for (i in 1:length(proxies)){
if (self != i){
proxies[[i]] %>% selectRows(NULL)
}
}
}
lapply(1:3, function(id) {
observe({
rownum <- input[[paste0("tab",id,"_rows_selected")]]
if (length(rownum) > 0) { resetRows(proxyList(), id) }
})
})
server = function(input, output) {
output$tab1 <- DT::renderDataTable(DTWrapper(head(mtcars[,1:3]), input$selectTop))
output$tab2 <- DT::renderDataTable(DTWrapper(head(mtcars[,1:3]), input$selectTop))
output$tab3 <- DT::renderDataTable(DTWrapper(head(mtcars[,1:3]), input$selectTop))
proxyList <- reactive({
proxies = list()
for (i in 1:3){
tableID <- paste("tab", i, sep="")
proxies[[i]] = dataTableProxy(tableID)
}
return(proxies)
})
reactiveText <- reactive({
rownum1 <- input$tab1_rows_selected
rownum2 <- input$tab2_rows_selected
rownum3 <- input$tab3_rows_selected
if (length(rownum1) > 0){return(c(rownum1, 1))}
if (length(rownum2) > 0){return(c(rownum2, 2))}
if (length(rownum3) > 0){return(c(rownum3, 3))}
})
output$txt1 <- renderText({
paste("You selected row ", reactiveText()[1]
, " from table ", reactiveText()[2], ".", sep="")
})
}
shinyApp(
ui = fluidPage(
fluidRow(column(4,DT::dataTableOutput("tab1"))
, column(4,DT::dataTableOutput("tab2"))
, column(4, DT::dataTableOutput("tab3")))
,fluidRow(column(4,textOutput("txt1")))
),
server = server
)
textOutput
は次のとおりである:「あなたはY番目のテーブルからX番目の行を選択しました」。編集後
この回答はThxです。それは前の選択のクリーンアップを処理します。これは素晴らしいことです。しかし、このようにして、あなたのコードの他の関数が 'rownum'を(どのように' Xoutput'を更新するために)取得するのですか?私ははっきりしているかどうかはわかりませんが、この懸念をより明確にするためにQを更新しようとしています。 Thx- – hartmut
私は自分の答えを – user5029763
に編集しました。私には50行以上のコードが保存されています。 – hartmut