r - 无法在 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 格式使用不同的镶嵌包?
解决方案
如果不提供由数据和代码组成的示例,人们可以复制并运行这些示例以可靠地重现您的错误,那么很难说是什么事情出错了。
但是,这里是一个闪亮的应用程序示例,它基于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()
推荐阅读
- excel - VBA代码不会从折线图中的定义范围添加类别
- python - Python多处理:在父进程退出后运行进程
- amazon-web-services - AWS Step Function NumericGreaterThan 参数
- mariadb - Mariadb alter table column 数据类型错误,错误的列
- sql - 根据工作代码显示表格中的不同字段
- flask - 烧瓶端点的 return 语句的默认返回类型是什么?
- c# - Rx.Net Window 函数扩展,支持计数、时间和大小
- php - E: 包 'php-xmlrpc' 没有安装候选
- android - 如何将 Pdf 文件转换为文本
- arrays - Javascript使用整数数组访问数组索引