2017-11-01 9 views
0

검색에 따라 많은 제품을 표시하는 반짝이는 앱이 있습니다. 큰 데이터 세트를 부분 집합으로 묶어 원하는 제품을 보여줍니다.다른 데이터 프레임의 서브 세트로 반짝 반짝 빛나는 Datatable의 팝업 표시

해당 제품에 대한 리뷰가있는 다른 데이터 프레임이 있습니다. 특정 행을 클릭하면 리뷰 정보가 다른 데이터 테이블에 나타납니다. 두 번째 데이터 테이블은 또한 카탈로그 번호를 기준으로 하위 집합을 할 필요가 (여기 A 열입니다.

감사 모든 도움을.

df1 <- data.frame(A= c("BX002","BX006", "BX008"), 
        B= c("Actin","Tubulin", "GAPDH"), 
        C = c("Mouse","Human", "Human"), 
        D = c("WB","WB", "IHC")) 
df2 <- data.frame(A= c("BX002","BX006", "BX008"), 
       B= c("Actin","Tubulin", "GAPDH"), 
       C = c("5","5", "4"), 
       D = c("Good","Good", "Bad"), 
       E = c("Kidney", "Liver", "Heart")) 

library(shinydashboard) 
library(shiny) 

app <- shinyApp(
     ui = dashboardPage(
          dashboardHeader(      
            title = "Search"), 
          dashboardSidebar(
             sidebarMenu(
               menuItem("Search Product", tabName = "product", icon = icon("search")))), 
          dashboardBody(
          tabItems(
          tabItem("product", 
            fluidPage(
             sidebarLayout(
               sidebarPanel(textInput("name", "Protein name", value = ""), 
                   submitButton("Search")), 
               mainPanel(
                 tabsetPanel(
                   tabPanel("Products", dataTableOutput("table1")))))))))), 



server = shinyServer(function(input, output, session) { 

     output$table1 <- DT::renderDataTable({ 

       validate(need(input$name != "", "Please select a Protein Name")) 

       search <- input$name 
       df <- subset(df1, grepl(search, df1$B, ignore.case = TRUE)==TRUE) 


       datatable(df, escape = FALSE, selection = "single") 

     }) 
       observeEvent(input$table1_rows_selected, 
           { 
             df <- subset(df2, df2$A == input$table1_rows_selected$A) 
             showModal(modalDialog(
               title = "Reviews", 
               df 

            )) 
           }) 


     }) 

)   

내가 몇 가지 방법을 시도했지만 그것이 작동되도록 기운 다.

이 내 마지막 atempt, 아니 상자 팝업, 오류 메시지에 불과하다.

최고의

답변

0

좀 libe했다 서식을 간단하게 다시 만들 수 있습니다.

modalDialog 함수가 DT과 작동하는 방식에 대한 설명을 제공해야합니다.

여기에 동작하는 예제입니다 :

library(shiny) 
library(DT) 


ui <- fluidPage(

    textInput('name','Protein Name'), 
    dataTableOutput('table1') 


) 

server <- function(input, output,session) { 

    df1 <- data.frame(A= c("BX002","BX006", "BX008"), 
        B= c("Actin","Tubulin", "GAPDH"), 
        C = c("Mouse","Human", "Human"), 
        D = c("WB","WB", "IHC")) 
    df2 <- data.frame(A= c("BX002","BX006", "BX008"), 
        B= c("Actin","Tubulin", "GAPDH"), 
        C = c("5","5", "4"), 
        D = c("Good","Good", "Bad"), 
        E = c("Kidney", "Liver", "Heart")) 


    tbl1 <- reactive({ 
    if(nchar(input$name)>0){ 

     df1[which(tolower(input$name) == tolower(df1$B)),] 
    } 

    }) 


    output$table1 <- renderDataTable({ 
    if(nchar(input$name)>0){ 
    datatable(tbl1(),selection = 'single') 
    } 

    }) 

    review_tbl <- reactive({ 

    df2[which(df1[input$table1_rows_selected,1]==df2$A),] 

    }) 


    observeEvent(input$table1_rows_selected,{ 

    showModal(
     modalDialog(
     renderDataTable({ 
     review_tbl() 
     }) 

     )) 
}) 



} 

# Run the application 
shinyApp(ui = ui, server = server) 
+0

가 대단히 감사합니다. 그러나 그것은 어떤 기능으로는 작동하지 않습니다. 정확한 일치 만 제공하기 때문에 제품과 정확히 일치하는 검색어는 검색되지 않습니다. 많은 사람들이 그리스 문자 등을 사용합니다. 불행히도 그것은 나를 위해 작동하지 않았다. 코드를 내 스펙 코드로 조정했는데 결과가'경고 : 데이터 테이블의 오류 : '데이터'가 2 차원 (예 : 데이터 프레임 또는 행렬)이어야합니다! ' 나는 무엇이 잘못되었는지 알지 못하지만 모든 컬럼을 얻지 못하도록 리뷰 데이터 프레임을 서브 세트해야합니다. –

+0

정확합니다. 그러나 좀 더 확장 된 검색 리턴 테이블을 만들기 위해 특정 코드 조각 (반응적인'tbl1')을 조정할 수 있어야합니다. 반응적인'review_tbl' 논리는 변경되어서는 안됩니다. – kostr

+0

그것은 나에게 결과가없는 것 같습니다. HTML과 하이퍼 링크가 많이 있기 때문에 찾을 수 없을 것입니다. 나는 또 다른 해결책을 찾았다. 이제 가입 패널을 통합해야합니다. 고맙습니다. –