如何创建一个 R shiny 应用程序来获取 PCA 图

How to create a R shiny app for getting PCA plot

我刚开始学习 R shiny,我正在尝试创建一个闪亮的应用程序,它可以生成用于主成分分析的散点图,并允许用户在散点图的 X 轴和 Y 轴上选择各种主成分。我知道如何编写 R 代码来执行 PCA,但我似乎无法获得闪亮的应用程序来获得我需要的东西。我已经尝试按照可用于 Iris kmeans 聚类的示例进行操作,但我无法获得散点图。到目前为止,这是我的代码(P.S。我的原始数据集的行是基因,列是样本(1 到 10 列是癌症样本,11 到 20 是正常样本):

data<-read.table("genes_data.txt", header=TRUE, row.names=1)
pca_data<-prcomp(t(data), scale=T)
summary(pca_data)
pca_sig.var<-pca_data$sdev^2
pca_sig.var.per<-round(pca_sig.var/sum(pca_sig.var)*100, 1)

pca_sig.data<-data.frame(Sample=rownames(pca_data$x), PC1=pca_data$x[,1], PC2=pca_data$x[,2], PC3=pca_data$x[,3], PC4=pca_data$x[,4], PC5=pca_data$x[,5])
pca_sig.data<-pca_sig.data[-1]

pca_sig.data2<-pca_sig.data
pca_sig.data2$category=rep("CANCER", 20)
pca_sig.data2$category[11:20]=rep("NORMAL", 10)
View(pca_sig.data2)
ggplot(data=pca_sig.data2, aes(x=PC1, y=PC2, label=category, colour=category))+
  geom_point(size=2, stroke=1, alpha=0.8, aes(color=category))+
  xlab(paste("PCA1 - ", pca_sig.var.per[1], "%", sep=""))+
  ylab(paste("PCA2 - ", pca_sig.var.per[2], "%", sep=""))+
  theme_bw()+
  ggtitle("My PCA Graph")


ui<-pageWithSidebar(
  headerPanel('Gene Data PCA'),
  sidebarPanel(
    selectInput('xcol', 'X Variable', names(pca_sig.data2[,1:5])),
    selectInput('ycol', 'Y Variable', names(pca_sig.data2[,1:5]),
                selected=names(pca_sig.data2)[[2]])

  ),
  mainPanel(
    plotOutput('plot1')
  )
)


server<- function(input, output, session) {

  # Combine the selected variables into a new data frame
  selectedData <- reactive({
    pca_sig.data2[, c(input$xcol, input$ycol)]
  })

  output$plot1 <- renderPlot({
    palette(c("#E41A1C", "#377EB8"))

    par(mar = c(5.1, 4.1, 0, 1))
    plot(selectedData(),
         col=selectedData()$category,
         pch = 20, cex = 3)
    points(selectedData()[,1:5], pch = 4, cex = 4, lwd = 4)
  })

}
shinyApp(ui = ui, server = server)

最后,当我 运行 应用程序时,我得到 "Error:undefined columns selected"

此外,为了简单起见,我们假设我要对其进行 PCA 的原始数据集看起来像这样(实际上我有大约 600 个基因和 20 个样本):

probeID<-c("gene1", "gene2", "gene3", "gene4","gene5")

BCR1<-c(28.005966, 30.806433, 17.341375, 17.40666, 30.039436)
BCR2<-c(30.973469, 29.236025, 30.41161, 20.914383, 20.904331)
BCR3<-c(26.322796, 25.542833, 22.460772, 19.972183, 30.409641)
BCR4<-c(26.441898, 25.837685, 23.158352, 20.379173, 33.81327)
BCR5<-c(39.750206, 19.901133, 28.180124, 22.668673, 25.748884)
CTL6<-c(23.004385, 28.472675, 23.81621, 26.433413, 28.851719)
CTL7<-c(22.239546, 28.741674, 23.754929, 26.015385, 28.16368)
CTL8<-c(29.590443, 30.041988, 21.323061, 24.272501, 18.099016)
CTL9<-c(15.856442, 22.64224, 29.629637, 25.374926, 22.356894)
CTL10<-c(38.137985, 24.753338, 26.986668, 24.578161, 19.223558)
data<-data.frame(probeID, BCR1, BCR2, BCR3, BCR4, BCR5, CTL6, CTL7, CTL8, CTL9, CTL10)

其中 BCR1 到 BCR5 是癌症样本,CTL6 到 CTL10 是正常样本。

这是你想要的吗?

server<- function(input, output, session) {

    # Combine the selected variables into a new data frame
    selectedData <- reactive({
        pca_sig.data2[c(input$xcol, input$ycol, 'category')]
    })

    output$plot1 <- renderPlot({
        palette(c("#E41A1C", "#377EB8"))

        plot(selectedData()[,c(1:2)], col=factor(selectedData()$category), pch = 20, cex = 3)
        points(selectedData()[,c(1:2)], pch = 4, cex = 4, lwd = 4)
    })

}

结果是这样的: