因此,经过大量的搜索和研究,我决定我不知道如何让它工作。本质上,我想要做的是使用ggplot_build访问我的绘图生成的数据。然而,绘图是通过renderPlot在Shiny中生成的,所以我无法在应用程序的其他地方访问它。
所以我想出的最接近的方法就是声明一个空的reactiveValue,然后每次都添加我的整个绘图函数。这样,我就可以在需要时访问plot对象,以便从ggplot_build获取数据。
问题是,虽然它没有抛出任何错误,但当我运行代码时,不会生成任何图。下面是代码本身,请记住,这是绘图本身的一个极其简化的示例。完整版本涉及大量的更多可能添加的geom_术语等。任何帮助都将不胜感激。提前谢谢你。
就我的数据而言,它在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)
发布于 2016-09-10 04:15:03
您不需要以这种方式使用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)https://stackoverflow.com/questions/39418725
复制相似问题