【问题标题】:ggplot stat_ecdf() with a Shiny reactive expressionggplot stat_ecdf() 带有闪亮的反应式表达式
【发布时间】:2019-07-24 00:16:40
【问题描述】:

我希望实现这里提供的 ggplotly 错误修复:

https://community.plot.ly/t/bug-with-ggplot2-stat-ecdf-function/1187/4

变成一个闪亮的反应式表达。下面的上图显示了 Shiny 中的ggplot() 调用结果(如预期的那样),下图来自ggplotly()

当我尝试在反应式表达式中插入 data <- data[order(data$val), ] 时,我无法按照修复程序的建议进行子集化:Error in data$val : object of type 'closure' is not subsettable,而且我似乎找不到任何其他可以工作的地方。

可重现app.r:

library(tidyverse)
library(shiny)
library(shinydashboard)
library(plotly)

 # generate sample p & t observation data
 zone <- c(rep("a", 6), rep("b", 6), rep("c", 6), rep("d", 6))
 set.seed(1)
 val <- rnorm(24, 12, 18)
 param <- rep(c("p", "t"), 12)
 p_t <- data.frame(zone, val, param, stringsAsFactors = FALSE)

# sample elevation frequency data - too many obs to uncount all at once
set.seed(2)
val <- sample(50, 24)
count <- sample(200000, 24)
 e_countcsv <- data.frame(zone, val, count,  stringsAsFactors = FALSE) %>%
                mutate(param = "elev")

 shinyApp(

 ui = fluidPage(

 sidebarLayout(sidebarPanel(

  selectizeInput(
    "zone", "zone", choices = unique(p_t$zone),
    selected = c("a"),
    multiple = TRUE),

  checkboxGroupInput("param", "parameter",
                     choices = c("elev", "p", "t"), selected =c("elev", "p"))
  ),

mainPanel(

  tabsetPanel(position=c("right"),

              tabPanel(strong("static cdf"), 
                       br(),
                       plotOutput("reg_plot",  height = "750px")) ,

              tabPanel(strong("interactive cdf"), 
                       br(),
                       plotlyOutput("plotlyPlot",  height = "750px")) )))

),

server = function(input, output) {

data <- reactive({

  p_t %>%
    filter(param %in% input$param,
           zone %in% input$zone) %>%
    bind_rows({e_countcsv %>%
        filter(param %in% input$param,
               zone %in% input$zone) %>%
        uncount(count)})

})

output$reg_plot <- renderPlot({

  ggplot(data(), aes(val, color = param, linetype = zone)) +
    labs(y = "proportion of total", x = NULL) +
    stat_ecdf(pad = FALSE)  + coord_flip()
})

output$plotlyPlot <- renderPlotly({

 p <-  ggplot(data(), aes(val, color = param, linetype = zone)) +
    labs(y = "proportion of total", x = NULL) +
    stat_ecdf(pad = FALSE)  + coord_flip()
  p <- ggplotly(p)
  p

  })

}  
)

有什么想法吗?谢谢!

【问题讨论】:

  • 您会收到错误 data$val : object of type 'closure' is not subsettable,因为当时 data 指向 函数 data(基本 R 中的默认值或您的反应式)。因此,请尝试sdata &lt;- data(); sdata &lt;- sdata[order(sdata$val),]
  • 谢谢@MrGumble,但在尝试了一些展示位置组合后,我没有骰子。

标签: r ggplot2 shiny r-plotly ggplotly


【解决方案1】:

就像@MrGumble 建议的那样,您不应该使用数据作为名称,因为它指向一个函数(尝试在控制台中打印数据,您将看到该函数)。

只需在反应式表达式中为您的数据集命名,它就会起作用:

data <- reactive({
  dataset <- p_t %>%
    filter(param %in% input$param,
           zone %in% input$zone) %>%
    bind_rows({e_countcsv %>%
        filter(param %in% input$param,
               zone %in% input$zone) %>%
        uncount(count)})
  dataset[order(dataset$val), ]
})

【讨论】:

  • 啊-我完全错过了。感谢@Wilmar 说得一清二楚。
猜你喜欢
  • 2022-10-31
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多