闪亮 PCA 和 ggbiplot 着色的问题

Problems with Shiny PCA and ggbiplot coloring

我在 Whosebug 上看到了很多关于 Shiny 中 aes 映射问题的问题,其中大部分都通过在人们的代码中使用 aes_string() 来解决。不过,这些几乎完全与 x/y 值有关。

我的问题是在将 ggbiplot 用于 PCA 时出现的,并且与映射着色变量有关。我的应用程序允许客户端上传他们自己的文件,但我 运行 通过 mtcars 只是为了确保它是一个可重现的错误(它是)。这是上传代码:

ui.R

library(shiny)
shinyUI(pageWithSidebar(
  headerPanel("Where the Flip are my colors?"),
  sidebarPanel(
    fileInput('file1', 'Choose CSV File',
              accept=c('text/csv',
                       'text/comma-separated-values,text/plain',
                       '.csv')),
    tags$hr(),
    checkboxInput('header', 'Header', TRUE),
    radioButtons('sep', 'Separator',c(Comma=',',Semicolon=';',Tab='\t'),','),
    selectInput("variable",label = h5("Coloring Variable"),"")
  ),
  mainPanel(
    tableOutput("inputfile"),
    plotOutput("PCA")
  )
))

server.R

library(shiny)
shinyServer(function(input, output, session) {
upData <- reactive({if(is.null(input$file1))return(NULL) 
  inFile <- input$file1
  dat <- read.csv(inFile$datapath)
  return(dat)
})
output$inputfile <- renderTable({
  upData()
})
observe({
  updateSelectInput(
    session,
    "variable",
    choices=names(upData()))
})
  output$PCA <- renderPlot({
    upData.pca <- prcomp(upData(), scale = TRUE)
    ggbiplot(upData.pca, obs.scale = 1, var.scale = 1) 
#    + geom_point(aes_string(color=input$variable))
  })
})

如果我按原样 运行 这段代码,它会提供我想要的上传数据框和 PCA 双标图。但是,当我取消对 geom_point 行的注释时,出现 "invalid argument to unary operator" 错误。我已经用 Shiny 完成了这个,代码 运行 用 mtcars 没问题。当我 运行 我的实际代码时,我得到一个 "object 'input' not found" 错误,所以我的玩具示例和我的实际问题不太一样,但我希望问题是相关的。

我查看了 Shiny 中关于 aes 的文档,并搜索了 Google 以寻找类似的问题,但未能找到解决方案。我会喜欢一些帮助。


使用 Gopala 的代码,我看到的错误是:

Warning: Error in [[: subscript out of bounds Stack trace (innermost first): 84: FUN 83: lapply 82: aes_string 81: layer 80: geom_point 79: renderPlot [#17] 71: output$PCA 4: <Anonymous> 3: do.call 2: print.shiny.appobj 1: <Promise> Don't know how to automatically pick scale for object of type tbl_df/tbl/data.frame. Defaulting to continuous. Warning: Error in : Aesthetics must be either length 1 or the same as the data (32): colour, x, y Stack trace (innermost first): 71: output$PCA 4: <Anonymous> 3: do.call 2: print.shiny.appobj 1: <Promise> Warning: Error in eval: object 'drat' not found Stack trace (innermost first): 71: output$PCA 4: <Anonymous> 3: do.call 2: print.shiny.appobj 1: <Promise>

这是我正在使用的代码,它有效:

library(shiny)
library(ggbiplot)

ui <- pageWithSidebar(
  headerPanel("Where the Flip are my colors?"),
  sidebarPanel(
    fileInput('file1', 'Choose CSV File',
              accept=c('text/csv',
                       'text/comma-separated-values,text/plain',
                       '.csv')),
    tags$hr(),
    checkboxInput('header', 'Header', TRUE),
    radioButtons('sep', 'Separator',c(Comma=',',Semicolon=';',Tab='\t'),','),
    selectInput("variable",label = h5("Coloring Variable"),"")
  ),
  mainPanel(
    tableOutput("inputfile"),
    plotOutput("PCA")
  )
)

server <- function(input, output, session) {
  upData <- reactive({if(is.null(input$file1)) return(mtcars) 
    inFile <- input$file1
    dat <- read.csv(inFile$datapath)
    return(dat)
  })
  output$inputfile <- renderTable({
    upData()
  })
  observe({
    updateSelectInput(session,
      "variable",
      choices=names(upData()))
  })
  output$PCA <- renderPlot({
    upData.pca <- prcomp(upData(), scale = TRUE)
    ggbiplot(upData.pca, obs.scale = 1, var.scale = 1) +
      geom_point(aes_string(color=input$variable))
  })
}

shinyApp(ui = ui, server = server)

嗯,终于明白了

geom_point(aes_string(color=upData()[,input$variable]))

出于我对 R 的有限理解之外的任何原因,我必须定义初始反应值 upData()

希望这能帮助其他人避免几天的痛苦。