2017-06-21 15 views
0

以下の例では、私は3を持っていますDT::datatables。私は、ユーザーがこれらすべてのテーブルから複数の行を選択できないようにしたい。その後、documentationの「既存のDataTablesインスタンスを操作する」セクションのとおり、dataTableProxyselectRowを使用します。それはうまく動作します。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番目の行を選択しました」。編集後

答えて

1

あなたはmodulesを試みることができます。別の方法はlapplyです。

lapply(1:3, function(id) { 
    observe({ 
     rownum <- input[[paste0("tab",id,"_rows_selected")]] 
     if (length(rownum) > 0) { 
     resetRows(proxyList(), id) 

     msg <- paste0("You selected row ", rownum, ", from table ", id, ".") 
     output$txt1 <- renderText(msg) 
     } 
    }) 
}) 
+0

この回答はThxです。それは前の選択のクリーンアップを処理します。これは素晴らしいことです。しかし、このようにして、あなたのコードの他の関数が 'rownum'を(どのように' Xoutput'を更新するために)取得するのですか?私ははっきりしているかどうかはわかりませんが、この懸念をより明確にするためにQを更新しようとしています。 Thx- – hartmut

+0

私は自分の答えを – user5029763

+0

に編集しました。私には50行以上のコードが保存されています。 – hartmut

関連する問題