2014-12-04 2 views
6

[code]R legami lucido costruire tra schede

library(shiny) 

server <- function(input, output) { 
    output$iris_type <- renderDataTable({ 
    data.frame(Species=paste0("<a href='#filtered_data'>", unique(iris$Species), "</a>")) 
    }) 
    output$filtered_data <- renderDataTable({iris}) 
} 

ui <- shinyUI(fluidPage(
    mainPanel(
    tabsetPanel(
     tabPanel("Iris Type", dataTableOutput("iris_type")), 
     tabPanel("Filtered Data", dataTableOutput("filtered_data")) 
    ) 
) 
)) 

shinyApp(ui = ui, server = server) 

[Domanda]

Sto cercando di collegare la DataTable uscita sulla prima scheda alla seconda scheda. Ad esempio, quando faccio clic su setosa, la prossima cosa che compare è la seconda scheda con il set di dati iris contenente solo setosa. Dovrebbe eseguire questa parte di codice da R: iris[iris$Species=="setosa",]. Dovrebbe funzionare anche per altri Species in iris.

Come posso creare il collegamento ed eseguire il comando R facendo clic?


[Aggiornamento sulla risposta]

Nel caso in cui si dispone di un layout diverso e deve essere specifica, ecco cosa si può fare.

  1. La funzione DataTable callback:

    callback = 
    "function(table) { 
        table.on('click.dt', 'tr', function() { 
        Shiny.onInputChange('rows', table.row(this).data()[0]); 
        $(\".tabbable .nav.nav-tabs li a:contains('Filtered Data')\").click(); 
        }); 
    }" 
    
  2. Il codice R:

    output$filtered_data <- renderDataTable({ 
        tagString <- input$rows 
        rawTags <- gsub("</a>", "", gsub("<a href='#filtered_data'>", "", tagString)) 
    
        if (identical(tagString, character(0))) { 
        iris 
        } else { 
        ... 
        } 
    }) 
    

risposta

2

E 'più facile avere la funzione di clic sulla riga della prima tabella. È possibile aggiungere una richiamata che cerca un clic sulle righe della tabella. Quando si osserva un clic, l'indice di riga viene inviato a un input reattivo lucido:

library(shiny) 

server <- function(input, output) { 
    output$iris_type <- renderDataTable({ 
    data.frame(Species=paste0("<a href='#filtered_data'>", unique(iris$Species), "</a>")) 
    }, 
    callback = "function(table) { 
    table.on('click.dt', 'tr', function() { 
     Shiny.onInputChange('rows', table.row(this).index()); 
     tabs = $('.tabbable .nav.nav-tabs li a'); 
     $(tabs[1]).click(); 
    }); 
}") 
    output$filtered_data <- renderDataTable({ 
    if(is.null(input$rows)){ 
     iris 
    }else{ 
     iris[iris$Species %in% unique(iris$Species)[as.integer(input$rows)+1], ] 
    } 
    }) 
} 

ui <- shinyUI(fluidPage(
    mainPanel(
    tabsetPanel(
     tabPanel("Iris Type", dataTableOutput("iris_type")), 
     tabPanel("Filtered Data", dataTableOutput("filtered_data")) 
    ) 
) 
)) 

shinyApp(ui = ui, server = server) 
+0

Grazie! Esattamente quello che sto cercando! – Boxuan

+0

Ho cercato online una soluzione simile e funziona bene, ma quello che noto è che se dovessi riordinare i collegamenti nella tabella Tipo di iris in modo che Virginica sia in cima e quindi fare clic sul collegamento per Virginica , riporta le colonne Setosa nella scheda Dati filtrati. Penso che questo sia perché il javascript "table.row" è predefinito in modo che la prima riga sia sempre Setosa, la seconda Versicolor e la terza Virginica. C'è un modo che il javascript possa identificare il nome all'interno della riga, invece del numero di riga stesso? –