geom_mosaic() 中的 product() 不接受 R Shiny 上的反应输入?

Posted

技术标签:

【中文标题】geom_mosaic() 中的 product() 不接受 R Shiny 上的反应输入?【英文标题】:product() in geom_mosaic() not accepting reactive inputs on R Shiny? 【发布时间】:2019-07-24 00:24:20 【问题描述】:

我正在使用 R Shiny 上的 geom_mosaic() 函数(ggmosaic 包的一部分)并想出了一个我已经尝试解决了几天的问题。

首先,一些示例数据:

a <- "a"
b <- "b" 
c <- "c"

df <- tribble(
  ~id, ~var1, ~var2, ~var3, 
  1, a, b, c,
  2, b, b, c,
  3, b, b, c,
  4, a, c, b, 
  5, a, a, a,
  6, b, c, c, 
  7, b, c, a,
  8, a, a, b,
  9, a, a, a, 
  10, b, b, c
)

似乎geom_mosaic() 不接受 Shiny 上的响应式输入,即代码 1(如下)在 R 控制台上工作正常,但代码 2(R Shiny 等效项)不起作用,并给出以下错误消息:

错误:找不到对象 ______

代码 1(geom_mosaic 在控制台上运行良好):

library(tidyverse)
library(ggmosaic)

selected_var1 <- "var1"
selected_var1_dat <- df[[selected_var1]]

selected_var2 <- "var2"
selected_var2_dat <- df[[selected_var2]]

ggplot(data = df) + 
  geom_mosaic(aes(x = product(selected_var1_dat), 
                  fill = selected_var2_dat, na.rm = T))

输出 ggplot(一切看起来都不错):

代码 2(现在,在 Shiny 中实现):


library(shiny) 
library(tidyverse)
library(ggmosaic)

varOptions <- c("var1", "var2", "var3")
a <- "a"
b <- "b"
c <- "c"

df <- tribble(
  ~id, ~var1, ~var2, ~var3, 
  1, a, b, c,
  2, b, b, c,
  3, b, b, c,
  4, a, c, b, 
  5, a, a, a,
  6, b, c, c, 
  7, b, c, a,
  8, a, a, b,
  9, a, a, a, 
  10, b, b, c
)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "selected_var1",
                  label = "X:",
                  choices = varOptions),
      selectInput(inputId = "selected_var2",
                  label = "Y:", 
                  choices = varOptions)
    ),
    mainPanel(
      plotlyOutput(outputId = "mosaic")
    )
  )
)

server <- function(input, output) 
  output$mosaic <- renderPlotly(

    selected_var1 <- input$selected_var1
    selected_var1_dat <- df[[selected_var1]]

    selected_var2 <- input$selected_var2
    selected_var2_dat <- df[[selected_var2]]

    ggplot(data = df) + 
      geom_mosaic(aes(x = product(selected_var1_dat), 
                      fill = selected_var2_dat, na.rm = T))

  )


shinyApp(ui = ui, server = server) 

输出此错误消息:

我尝试了不同的方法来解决这个问题,但没有成功。我与 Shiny 合作过很多次,它似乎与我使用过的所有其他 ggplot 图表一起工作。有人对可能发生的事情有任何想法吗?

【问题讨论】:

【参考方案1】:

ggmosaicplotly 目前不兼容。您可以使用以下代码让您的应用在不使用 plotly 的情况下运行。

library(shiny) 
library(tidyverse)
library(ggmosaic)
#library(plotly)

a <- "a"
b <- "b"
c <- "c"

df <- tribble(
  ~id, ~var1, ~var2, ~var3, 
  1, a, b, c,
  2, b, b, c,
  3, b, b, c,
  4, a, c, b, 
  5, a, a, a,
  6, b, c, c, 
  7, b, c, a,
  8, a, a, b,
  9, a, a, a, 
  10, b, b, c
)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "selected_var1",
                  label = "X:",
                  choices = names(df)[-1]),
      selectInput(inputId = "selected_var2",
                  label = "Y:", 
                  choices = names(df)[-1])
    ),
    mainPanel(
      plotOutput(outputId = "mosaic")
    )
  )
)

server <- function(input, output) 

  output$mosaic <- renderPlot(
    ggplot(data = df) + 
      geom_mosaic(aes(x = product(!!sym(input$selected_var1)), 
                      fill = !!sym(input$selected_var2)))
  )


shinyApp(ui = ui, server = server) 

【讨论】:

另外——对于任何关心的人,this SO thread 提供了关于马赛克图和 geom_mosaic() 的不同替代方案的精彩讨论。我将使用它来实现闪亮,直到 geom_mosaic() / ggplotly() 交互再次启动并运行!【参考方案2】:

我还没有完全弄清楚这一点,但如果您满足以下条件,您的应用就会运行良好:

    运行代码之前 ui / server 部分 在控制台输入selected_var1_dat = df[["var1"]]selected_var1_dat = df[["var2"]] 运行应用程序

所以问题似乎是在您的服务器代码中,selected_var1_dat &lt;- df[[selected_var1]] 没有产生任何结果,这表明selected_var1 &lt;- input$selected_var1 没有产生任何结果。

【讨论】:

我也注意到了!尽管我尝试过使用其他图表,但selected_var1_dat &lt;- df[[selected_var1]] 确实产生了结果。这就是为什么我认为可能是geom_mosaic() 所需的product() 函数导致了问题?

以上是关于geom_mosaic() 中的 product() 不接受 R Shiny 上的反应输入?的主要内容,如果未能解决你的问题,请参考以下文章

具有不对称偏移的ggmosaic图

如何使用 Ocmod 在 Opencart 3.0.2.0 中的 product.twig(catalog/view/theme/default/template/product/) 中添加自定义表单

为啥表达式逻辑表达式`product.id === +id;`中的加号? [复制]

Prestashop 1.6.0.9 - 循环中的 $product->save() 只需要 10 个产品

Python itertools 模块中的 product 函数

修改 Xcode 的 project.pbxproj 中的 PRODUCT_BUNDLE_IDENTIFIER