2014-12-04 11 views
6

[code]R linki błyszczące budować między kartami

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) 

[Pytanie]

Próbuję połączyć wyjście DataTable na pierwszej karcie do drugiej zakładce. Na przykład po kliknięciu na setosa kolejną rzeczą, która się pojawi, jest druga karta z iris zestawem danych zawierającym tylko setosa. Powinien wykonać ten fragment kodu z R: iris[iris$Species=="setosa",]. To powinno działać również dla innych Species w iris.

Jak mogę utworzyć łącze i uruchomić polecenie R, klikając?


[Aktualizacja na odpowiedź]

W przypadku gdy masz inny układ i musi być konkretne, o to co można zrobić.

  1. Twoja funkcja DataTable zwrotna:

    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. Kod R:

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

Odpowiedz

2

Łatwiej jest mieć funkcję kliknąć na wierszu pierwszej tabeli. Możesz dodać wywołanie zwrotne, które szuka kliknięcia wierszy tabeli. Po kliknięciu indeks wiersza jest wysyłany do błyszczącego wejścia biernego:

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

Dzięki! Dokładnie to, czego szukam! – Boxuan

+0

Szukałem w Internecie dla podobnego rozwiązania i to działa dobrze, ale zauważam, że jeśli miałbyś ponownie sortować linki w tabeli typu Iris tak, że Virginica jest na górze, a następnie kliknij na link do Virginica , przywraca kolumny Setosa w zakładce Filtered Data. Myślę, że dzieje się tak dlatego, że w javascriptie "table.row" jest zdefiniowany tak, że pierwszy wiersz to zawsze Setosa, drugi Versicolor i trzeci Virginica. Czy istnieje sposób, w jaki javascript mógłby zidentyfikować nazwę w wierszu, zamiast samego numeru wiersza? –

Powiązane problemy