首页 > 解决方案 > 无法在 R-shiny 中显示 2x2 表格马赛克图

问题描述

我正在创建一个Rshiny 应用程序,它允许用户上传一些临床数据,并根据他们打开的选项卡查看几个不同的图。其中包括折线图、饼图和马赛克图。我可以根据上传的数据和用户输入查看折线图和饼图,但无法显示马赛克图。我收到一条错误消息,提示“找不到对象'输入'”。

我尝试在 R 中使用 ggmosaic(geom_mosaic) 和 structable 包来显示绘图。在我感兴趣的数据表中,有 5 列:REF(2x2 列联表的参考方法结果,它是二进制的——POS 或 NEG 临床结果),结果(4 个差异值:真阳性,假阴性,真阴性,假阳性),值(每个结果的患者数量),样本类型(患者样本的类型 - NS,NP,总体是此列的 3 个可能的数据值)和比较器(POS 或 NEG 临床结果)。在括号中,我已经包含了人们期望每列的值类型。此外,对于我的 R 闪亮马赛克应用程序,我在左侧有几个用户输入,一旦用户选择它们就可以构建应用程序:为 REF 列选择输入,为样本类型列选择输入,选择比较器的输入。我在服务器函数中编写了代码,该函数使用这 3 个输入来构建马赛克图。

编辑:我已在标题为“原始数据”的最顶部链接中附加了我的原始数据。

马赛克图数据表 - 从饼图中获取数据,但以#不同的视觉格式显示

  MosaicDF <- reactive({
    
    #display mosaic 
    Mosaic_filtered <- select(PieData_extracted(),-c(3,5:7))
    
    
    
    #data transformation
    names(Mosaic_filtered)[1]<-"REF"
    Mosaic_filtered$SampleType <- "NS"
    Mosaic_filtered$Comparator <- c("POS","NEG","NEG","POS")
    Mosaic_filtered$REF <- c("POS","POS","NEG","NEG")
    Mosaic_filtered$F2 <- factor(as.character(Mosaic_filtered$Value))
    MYRaw <- Mosaic_filtered[rep(rownames(Mosaic_filtered),as.numeric(as.character(Mosaic_filtered$F2))), ]
    MYRaw <- as.data.frame(MYRaw)
    
    #update select input for mosaic plot
    updateSelectInput(session, inputId = 'REF', label = 'Select Reference column',
                      choices = names(MYRaw), selected = "")
    updateSelectInput(session, inputId = 'SampleType', label = 'Select Sample Type column',
                      choices = names(MYRaw), selected = "")
    updateSelectInput(session, inputId = 'Comparator', label = 'Select Comparator column',
                      choices = names(MYRaw), selected = "")
    
    return(MYRaw)
    
  })


 #display mosaic plot
  
  output$mosaic <- renderPlot({
    
    ggplot(data=MosaicDF())+geom_mosaic(aes(x=product(input$REF,input$Comparator),fill=input$REF))+labs(x="Comparator",y="REF")
  })
  
}

我正在获取数据表(从中构建马赛克图)以显示为输出,但马赛克图本身不会显示。它说:

“错误:找不到对象输入”。

饼图数据表和饼图本身确实出现在该图的选项卡上。(R shiny 应用程序中每个不同的绘图都有 3 个选项卡,用户可以从中选择任何一个,从下拉菜单中选择一些输入,并允许根据输入自动构建应用程序)。

我想知道是否有办法修改我的反应数据表或绘图本身的代码——我应该为 ggplot 更改代码,还是为 Rshiny 格式使用不同的镶嵌包?

标签: rggplot2shinyshiny-reactivityr-mosaic

解决方案


如果不提供由数据和代码组成的示例,人们可以复制并运行这些示例以可靠地重现您的错误,那么很难说是什么事情出错了。

但是,这里是一个闪亮的应用程序示例,它基于geom_mosaic().

library(ggmosaic)
library(rlang)
library(shiny)

ui <- fluidPage(

    sidebarLayout(
        sidebarPanel(
            selectInput("REF", "REF", "Survived"), 
            selectInput("Comparator", "Comparator", c("Class", "Sex", "Age"))
        ),

        mainPanel(
           plotOutput("old_mosaic"), 
           plotOutput("new_mosaic")
        )
    )
)

server <- function(input, output) {
    titanic_data <- reactive({
        data(Titanic)
        titanic <- as.data.frame(Titanic)
        titanic$Survived <- factor(titanic$Survived, levels=c("Yes", "No"))
        titanic
    })

    output$old_mosaic <- renderPlot({
        ggplot(data = titanic_data()) + 
            geom_mosaic(aes(weight = Freq, x = product(input$REF, input$Comparator), fill = input$REF)) + 
            labs(title = "Old Way")
    })

    output$new_mosaic <- renderPlot({
        ggplot(data=titanic_data()) +
            geom_mosaic(aes(weight = Freq, x = product(!!sym(input$REF), !!sym(input$Comparator)), fill = !!sym(input$REF))) + 
            labs(title = "New Way")
    })
}

shinyApp(ui, server)

生成第一个图的代码类似于您的 ggplot 代码,它尝试按原样使用 input$id(s)。在我的机器上,第一个图会产生您描述的错误,在其他情况下,这种方法似乎会产生相同的错误

该帖子当时的解决方案是aes_string()替换aes(). 但是,在这里我们不应该这样做,因为aes_string()它已被软弃用;更重要的是,我们不能仅仅使用aes_string(),因为我们仍然需要与product()元素抗衡。

返回示例应用程序,请注意第二个图的渲染没有问题。在这段代码中,我采用了新的惯用方式,将输入字符串转换为符号,然后取消引用它。

因此,如果我是正确的,这是你的错误的根源,那么你应该在你的 ggplot 代码input$id中用 a包装每个。!!sym()


推荐阅读