2016-09-09 3 views
0

많은 검색과 조사를 거쳐이 작업을 수행하는 방법을 알지 못했습니다. 기본적으로 ggplot_build를 사용하여 플롯에서 생성 된 데이터에 액세스합니다. 그러나 플롯은 renderPlot을 통해 Shiny에서 생성되므로 앱의 다른 곳에서 액세스 할 수 없습니다.Shiny R의 renderPlot에서 ggplot_build에 액세스해야합니다.

그래서 가장 가까운 점은 빈 reactiveValue를 선언하고 매번 내 전체 플로팅 기능을 추가하는 것입니다. 이렇게하면 ggplot_build에서 데이터를 가져 오기 위해 필 요할 때 플롯 객체에 접근 할 수 있습니다.

문제는 아무런 오류도 발생시키지 않지만 내 코드를 실행할 때 플롯이 생성되지 않는다는 것입니다. 코드 자체는 아래에 있으며, 플로팅 자체의 매우 단순한 예입니다. 정식 버전에는 추가 된 geom_ terms 등의 상당한 양이 포함됩니다. 모든 도움이 크게 감사 할 것입니다. 미리 감사드립니다.

는 지금까지 내 데이터와 같은, 그것은 CSV에서의이 같은 같습니다

Year,Field,Company,Hybrid,Yield,Moisture,Erect,DoP,DoH,RM,Stand,PPA 
 
1934,Alhambra,Champion,White Pearl,9.1,39.5,NaN,2-May,20-Nov,NaN,NaN,NaN 
 
1944,Galesburg,Pioneer,334,92.7,18.3,99.3,20-May,8-Nov,NaN,NaN,NaN 
 
1945,Sheldon,Funk,G-169,70.6,24.3,39,25-May,8-Nov,NaN,NaN,NaN 
 
1946,Galesburg,Doubet,D-42,100.8,22,94,24-May,8-Nov,NaN,NaN,NaN 
 
1949,DeKalb,Ferris,F-11,51.3,18.4,91,23-May,16-Nov,NaN,72,NaN

그리고 코드 :

Variable_Extractor <- function(dataset) { 
 
    vars = names(dataset) 
 
    for (i in vars) { 
 
    if (is.factor(dataset[[i]][1]) == TRUE) { 
 
     vars = vars[vars != i] 
 
    } 
 
    } 
 
    return(vars) 
 
} 
 

 
Identify_Min_Max <- function(dataset, var) { #var must be a string column name 
 
    a = min(dataset[[var]], na.rm = TRUE) 
 
    b = max(dataset[[var]], na.rm = TRUE) 
 
    return(c(a,b)) 
 
} 
 

 
ui <- fluidPage(
 
    titlePanel('Illinois Yield Trials'), 
 
    
 
    sidebarLayout(position = 'left', 
 
     sidebarPanel(
 
     selectInput('var', 'Choose variable', 
 
        c('Choose one' = '', Variable_Extractor(agridata))), 
 
     uiOutput('histslider'), 
 
     numericInput('bin_width', 'Enter binwidth', 
 
        value = 5, min = 0, max = 1000)), 
 
       
 
     mainPanel(div(style = "position:relative", 
 
        plotOutput('plot'))) 
 
    ) 
 
) 
 

 
    server <- function(input, output) { 
 
    
 
    output$histslider <- renderUI({ 
 
     valhist <- Identify_Min_Max(agridata, toString(input$var)) 
 
     sliderInput(inputId = 'sliderhist', 
 
        label = paste("Select values for ", input$var, sep = ''), 
 
        min=valhist[1], 
 
        max=valhist[2], 
 
        value=valhist, 
 
        sep= '') 
 
    }) 
 
    
 
    plt <- reactiveValues() 
 
    
 
    output$plot <- renderPlot({ 
 
     plt$p <- ggplot() 
 
     agridatasub <- subset(agridata, agridata[[input$var]] >= input$sliderhist[1] & agridata[[input$var]] <= input$sliderhist[2]) 
 
     plt$p <- plt$p + geom_histogram(data=agridatasub, aes_string(x=input$var), binwidth = input$bin_width, 
 
       color = 'black', fill = 'gray75') 
 
     return(plt$p) 
 
    }) 
 
    
 
    } 
 

 
    shinyApp(ui=ui, server=server)

답변

1

당신 그런 식으로 reactiveValues 사용할 필요가 없습니다, 당신은 할 수 있습니다 대신 데이터 세트의 조리개를 사용하여

plt <- reactive({ 
agridatasub <- subset(agridata, agridata[[input$var]] >= input$sliderhist[1] & agridata[[input$var]] <= input$sliderhist[2]) 
    ggplot() + geom_histogram(data=agridatasub, aes_string(x=input$var), binwidth = input$bin_width, 
            color = 'black', fill = 'gray75') 
}) 
output$plot <- renderPlot({ 
    plt() 
}) 

전체 예 :

Variable_Extractor <- function(dataset) { 
    vars = names(dataset) 
    for (i in vars) { 
    if (is.factor(dataset[[i]][1]) == TRUE) { 
     vars = vars[vars != i] 
    } 
    } 
    return(vars) 
} 

Identify_Min_Max <- function(dataset, var) { #var must be a string column name 
    a = min(dataset[[var]], na.rm = TRUE) 
    b = max(dataset[[var]], na.rm = TRUE) 
    return(c(a,b)) 
} 
library(shiny) 
ui <- fluidPage(
    titlePanel('Illinois Yield Trials'), 

    sidebarLayout(position = 'left', 
       sidebarPanel(
        selectInput('var', 'Choose variable', 
           c('Choose one' = '', Variable_Extractor(iris))), 
        uiOutput('histslider'), 
        numericInput('bin_width', 'Enter binwidth', 
           value = 5, min = 0, max = 1000)), 

       mainPanel(div(style = "position:relative", 
           plotOutput('plot')), 
          verbatimTextOutput("test")) 
) 
) 

server <- function(input, output) { 

    output$histslider <- renderUI({ 
    valhist <- Identify_Min_Max(iris, toString(input$var)) 
    sliderInput(inputId = 'sliderhist', 
       label = paste("Select values for ", input$var, sep = ''), 
       min=valhist[1], 
       max=valhist[2], 
       value=valhist, 
       sep= '') 
    }) 

    plt <- reactive({ 
    req(input$var) 
    irissub <- subset(iris, iris[[input$var]] >= input$sliderhist[1] & iris[[input$var]] <= input$sliderhist[2]) 

    ggplot() + geom_histogram(data=irissub, aes_string(x=input$var), binwidth = input$bin_width, 
            color = 'black', fill = 'gray75') 
    }) 

    output$plot <- renderPlot({ 

    return(plt()) 
    }) 

    output$test <- renderPrint({ 
    req(input$var) 
    str(ggplot_build(plt())) 
    }) 

} 

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

여러분의 도움에 감사드립니다! – Sydney

관련 문제