2016-08-26 1 views
6

내가, 사용자가 산점도을 할 수 있도록 플롯에 점의 부분 집합을 선택하는 작은 응용 프로그램을 작성하는 것을 시도하고, 단지 그 선택한 점과 .CSV 형식으로 다음 출력 테이블. 페이지를 만들고 실행하는 방법과 brushedPoints를 사용하여 점을 선택하는 방법을 알아 냈습니다. 선택한 점이있는 표가 나타나지만 다운로드 버튼을 누르면 "shinyoutput 객체에서 객체 읽기가 허용되지 않습니다."라는 오류가 나타납니다. 나타납니다. 스크린에서 시각적으로 .csv로 볼 수있는 테이블을 다운로드 할 수 없습니까? 그렇다면 해결 방법이 있습니까?반짝이는 출력 개체에서 개체를 읽을 수 없습니까?

나는 아래의 홍채 데이터 세트를 사용하여 문제를 다시했습니다. 왜 내가 표시된 행의 테이블을 다운로드 할 수 없는지 알아내는 데 큰 도움이 될 것입니다.

data(iris) 

ui <- basicPage(
    plotOutput("plot1", brush = "plot_brush"), 
    verbatimTextOutput("info"),mainPanel(downloadButton('downloadData', 'Download')) 
) 


server <- function(input, output) { 
    output$plot1 <- renderPlot({ 
ggplot(iris,aes(x=Sepal.Width,y=Sepal.Length)) + 
    geom_point(aes(color=factor(Species))) + 
    theme_bw() 
    }) 

    output$info <- renderPrint({ 
brushedPoints(iris, input$plot_brush, xvar = "Sepal.Width", yvar = "Sepal.Length") 
    }) 

    output$downloadData <- downloadHandler(
     filename = function() { 
     paste('SelectedRows', '.csv', sep='') }, 
     content = function(file) { 
     write.csv(output$info, file) 
     } 
) 

} 


shinyApp(ui, server) 

답변

10

출력 개체가 모든 웹 표시 물건도 생성한다는 것이 문제입니다. 대신 다운로드를 위해 데이터를 별도로 가져와야합니다. 다운로드 코드에서 brushedPoints에 대한 두 번째 호출을 통해이 작업을 수행 할 수 있습니다. 더 나은 그러나 그 모든 곳에서 당신이 그것을 필요로 전화 한 번만 그것을 할 수있는 reactive() 기능을 사용하는 것입니다. . 여기에 내가 그 일하도록 코드를 수정하는 것이 방법입니다, 당신은 명시 적으로 brushedPoints 그래서에서 xvaryvar을 설정할 필요가 없습니다

data(iris) 

ui <- basicPage(
    plotOutput("plot1", brush = "plot_brush"), 
    verbatimTextOutput("info"),mainPanel(downloadButton('downloadData', 'Download')) 
) 


server <- function(input, output) { 
    output$plot1 <- renderPlot({ 
    ggplot(iris,aes(x=Sepal.Width,y=Sepal.Length)) + geom_point(aes(color=factor(Species))) + theme_bw() 
    }) 


    selectedData <- reactive({ 
    brushedPoints(iris, input$plot_brush) 
    }) 

    output$info <- renderPrint({ 
    selectedData() 
    }) 

    output$downloadData <- downloadHandler(
    filename = function() { 
     paste('SelectedRows', '.csv', sep='') }, 
    content = function(file) { 
     write.csv(selectedData(), file) 
    } 
) 

} 


shinyApp(ui, server) 

(참고, ggplot2과를, 나는의 유연성을 높이기 위해 여기를 제거 코드)

shiny에 "올가미"스타일의 무료 드로잉 어빌리티가 없습니다 (단, 일주일에 한번씩 재미있는 툴을 추가하고 있습니다). 그러나 사용자가 여러 영역을 선택하거나 개별 점을 클릭하도록 허용하여 동작을 모방 할 수 있습니다. 당신이 반복해서 사용할 수 있도록하기 위해 reactiveValues 객체에 결과를 저장하기 위해 필요로하는 서버의 논리는, 많이 지저분를 가져옵니다. 한 플롯에서 점을 선택하고 다른 플롯에서 강조/제거 할 수 있도록 비슷한 작업을 수행했습니다. 그것은 당신이 여기 필요한 것보다 더 복잡합니다,하지만 아래에서 작동해야합니다. 다른 버튼/로직을 추가 할 수도 있습니다 (예 : 선택을 '재설정').하지만이 방법을 사용해야한다고 생각합니다. 플롯에 선택 표시를 추가하여 선택한 항목을 추적 할 수있게했습니다.

data(iris) 

ui <- basicPage(
    plotOutput("plot1", brush = "plot_brush", click = "plot_click") 
    , actionButton("toggle", "Toggle Seletion") 
    , verbatimTextOutput("info") 
    , mainPanel(downloadButton('downloadData', 'Download')) 
) 


server <- function(input, output) { 
    output$plot1 <- renderPlot({ 

    ggplot(withSelected() 
      , aes(x=Sepal.Width 
       , y=Sepal.Length 
       , color=factor(Species) 
       , shape = Selected)) + 
     geom_point() + 
     scale_shape_manual(
     values = c("FALSE" = 19 
        , "TRUE" = 4) 
     , labels = c("No", "Yes") 
     , name = "Is Selected?" 
    ) + 
     theme_bw() 
    }) 

    # Make a reactive value -- you can set these within other functions 
    vals <- reactiveValues(
    isClicked = rep(FALSE, nrow(iris)) 
) 


    # Add a column to the data to ease plotting 
    # This is really only necessary if you want to show the selected points on the plot 
    withSelected <- reactive({ 
    data.frame(iris 
       , Selected = vals$isClicked) 
    }) 



    # Watch for clicks 
    observeEvent(input$plot_click, { 

    res <- nearPoints(withSelected() 
         , input$plot_click 
         , allRows = TRUE) 

    vals$isClicked <- 
     xor(vals$isClicked 
      , res$selected_) 
    }) 


    # Watch for toggle button clicks 
    observeEvent(input$toggle, { 
    res <- brushedPoints(withSelected() 
         , input$plot_brush 
         , allRows = TRUE) 

    vals$isClicked <- 
     xor(vals$isClicked 
      , res$selected_) 
    }) 

    # pull the data selection here 
    selectedData <- reactive({ 
    iris[vals$isClicked, ] 
    }) 

    output$info <- renderPrint({ 
    selectedData() 
    }) 

    output$downloadData <- downloadHandler(
    filename = function() { 
     paste('SelectedRows', '.csv', sep='') }, 
    content = function(file) { 
     write.csv(selectedData(), file) 
    } 
) 

} 


shinyApp(ui, server) 
+0

마크,이 완벽하게 작동! 리 액티브 기능은 특히 유용합니다. 제 관심을 가져 주셔서 감사합니다. 정말 고마워. – KrisF

+0

마크, brushedPoints의 옵션은 사용자가 사각형 내에서 포인트를 선택할 수 있도록 나에게 발생했습니다. 가능한 "올가미"옵션이 있습니까? 나는 주변을 수색했지만 Plot.ly에서 위의 스크립트를 다시 작성해야하는 "올가미"옵션을 찾을 수 없었다. – KrisF

+0

직접 알지 못합니다. 그러나 여러 선택을하는 방법을 보여주는 편집을 추가 했으므로 결국에는 동일한 동작을 제공 할 수 있습니다. –