2015-02-02 10 views

risposta

15

AGGIORNAMENTO: ora è possibile accedere alle righe selezionate utilizzando input$tableId_rows_selected in server.R. Vedi here per maggiori dettagli.

Per selezionare una riga unica, è possibile modificare la funzione di callback del vostro esempio a questo:

callback = "function(table) { 
     table.on('click.dt', 'tr', function() { 
      table.$('tr.selected').removeClass('selected'); 
      $(this).toggleClass('selected');    
     Shiny.onInputChange('rows', 
          table.rows('.selected').data()[0][0]); 
     }); 
    }" 

Quando si fa clic su una riga, rimuove in pratica qualsiasi righe selezionate (che hanno la classe .selected) e seleziona la riga su cui hai fatto clic.

Ho anche modificato il codice nella funzione Shiny.onInputChange in modo che restituisca il numero nella prima colonna.

+0

Come modificheresti questo codice per selezionare più righe da un datatable ordinato? Ho provato '.data() [0] [0] .toArray()' ma non funziona. –

1

Questa non è una soluzione diretta all'esempio che hai pubblicato, tuttavia fornisce una risposta con un altro esempio.

C'è un esempio di app lucido scaricabile dato e discusso nel seguente link, click here! per selezionare una singola riga in una tabella usando un parametro di classe.

-1

Il codice seguente mostra un dataframe in formato tabella DT. Gli utenti saranno in grado di selezionare una singola riga. La riga selezionata viene recuperata e visualizzata. puoi scrivere la tua funzione di trama nel blocco di trama nel server.

Spero che questo aiuti !!

  # Server.R 
     shinyServer(function(input, output,session) { 




      output$sampletable <- DT::renderDataTable({ 
      sampletable 
      }, server = TRUE,selection = 'single') 

      output$selectedrow <- DT::renderDataTable({ 

      selectedrowindex <<-  input$sampletable_rows_selected[length(input$sampletable_rows_selected)] 
     selectedrowindex <<- as.numeric(selectedrowindex) 
     selectedrow <- (sampletable[selectedrowindex,]) 
     selectedrow 



      }) 

      output$plots <- renderPlot({ 

      variable <- sampletable[selectedrowindex,1] 
      #write your plot function 


       }) 


      }) 

      #ui.R 
      shinyUI(navbarPage("Single Row Selection", 



       tabPanel("Row selection example", 
         sidebarLayout(sidebarPanel("Parameters"), 
          mainPanel(
           DT::dataTableOutput("selectedrow"), 
          DT::dataTableOutput("sampletable") 

          )) 

        ) 

        )) 

     # global.R 

     library(DT) 
     library(shiny) 
     selectedrowindex = 0 
9

Il metodo R che esegue il rendering di un DataTable ha un parametro che definisce la modalità di selezione. Per esempio:

output$table1 <- 
    DT::renderDataTable(dataSet, 
         selection = 'single') 

valori possibili sono ('multiple' è il default):

  • nessuno
  • singolo
  • multipla

Per ulteriori riferimenti si possono vedere: http://rstudio.github.io/DT/shiny.html

EDIT 04/14/2016

Nella configurazione che uso a lavorare con singola modalità di selezione ha problemi.

Ecco la versione che uso:

> DT:::DataTablesVersion 
[1] "1.10.7" 
> packageVersion("DT") 
[1] ‘0.1’ 

Il problema che ho riscontrato è che visivamente si dispone di una singola selezione di fila, ma quando lo fai:

observeEvent(input$table1_rows_selected, { 
    str(input$table1_rows_selected) 
}) 

Si otterrà una lista con tutti i righe che sono state selezionate ma non sono state deselezionate esplicitamente. In altre parole, la selezione di una nuova riga non deseleziona automaticamente la riga precedente nella logica Datatables interna. Ciò potrebbe anche essere dovuto al wrapper DT, non è sicuro.

Questo è il motivo attualmente come una soluzione che usiamo JS per questo:

$(document).on('click', '#table1 table tr', function() { 
    var selectedRowIds = $('#table1 .dataTables_scrollBody table.dataTable').DataTable().rows('.selected')[0]; 

    var selectedId = ""; 
    if (selectedRowIds.length === 1) { 
     selectedId = $(this).children('td:eq(0)').text(); 
    } else { 
     $('#table1 tbody tr').removeClass('selected'); 
    } 
    Shiny.onInputChange("table1_selected_id", selectedId); 
}); 

volta che hai questo in luogo si sarà in grado di fare:

observeEvent(input$table1_selected_id, { 
    str(input$table1_selected_id) 
}) 

Questo ora almeno manda corretta dati al tuo server. Codice. Sfortunatamente avrai ancora un problema con la tabella perché internamente tiene traccia di quali file sono state selezionate e se cambi pagina ripristinerà una selezione errata. Ma almeno questo è puramente un difetto visivo e il tuo codice avrà la possibilità di funzionare correttamente. Quindi questa soluzione ha bisogno di più lavoro.

+0

Questo è ancora un problema nella versione CRAN a partire da oggi, ma sembra essere risolto nella versione di sviluppo: 'devtools :: install_github ('rstudio/DT')' – Teajay

+0

Se si sa che si tratta di selezione singola potresti essere in grado di usare '_row_last_clicked' – PeterVermont

Problemi correlati