недостающая эстетика с блеском и ggtern - PullRequest
1 голос
/ 10 июля 2020

Я хотел бы создать приборную панель тернарного сюжета с помощью Shiny. Но я застрял в этой ошибке. Этот код принимает файл CSV и обновляет три раскрывающихся списка. Затем созданный троичный график имеет эти три раскрывающихся значения.

Проблема в том, что при добавлении "geom_point ()" к obj я получаю эту ошибку -> CoordTern требует следующей недостающей эстетики (tlr- > xy): z

Та же самая, но другая проблема, когда я хочу добавить stat_de density_tern Я получаю эту ошибку -> stat_de density_tern требует следующей недостающей эстетики: z

library(shiny)
library(colourpicker)
library(ggplot2)
library(ggtern)

ui <- fluidPage(

    titlePanel("TernaryPlot"),
    fileInput("csv_file", "source", multiple = FALSE, accept = "csv",
              width = NULL, buttonLabel = "Browse...",
              placeholder = "No file selected"),
    
    selectInput("x_val", "Choose x values:", choices=c()),
    selectInput("y_val", "Choose y values:", choices=c()),
    selectInput("z_val", "Choose z values:", choices=c()),
    
    checkboxInput("show_point", "points", value = FALSE, width = NULL),
    checkboxInput("show_dens", "density", value = FALSE, width = NULL),
    plotOutput("ggtern")
    )
    
server <- function(session,input, output) {
    
    selectedData <- reactive({
        inFile <- input$csv_file
        if (is.null(inFile))
            return(NULL)
        df <- read.csv(inFile$datapath,na.strings = c("", "NA", "#N/A"))
        updateSelectInput(session,"x_val","x series",colnames(df))
        updateSelectInput(session,"y_val","y series",colnames(df))
        updateSelectInput(session,"z_val","z series",colnames(df))
        return(df)
        })
    
    T1 <- reactive({
        if (is.null(selectedData()))
            return(NULL)
        temp <- selectedData()[input$x_val]
        return (unlist(temp))
    })
    
    T2 <- reactive({
        if (is.null(selectedData()))
            return(NULL)
        temp <- selectedData()[input$y_val]
        return (unlist(temp))
    })
    
    T3 <- reactive({
        if (is.null(selectedData()))
            return(NULL)
        temp <- selectedData()[input$z_val]
        return (unlist(temp))
    })
    

    output$ggtern <- renderPlot({
        
        if (is.null(selectedData()))
            return(NULL)
        if (is.null(T1()))
            return(NULL)
        
        x_s <- T1()
        y_s <- T2()
        z_s <- T3()
        vec <- aes_string(x_s,y_s,z_s)
        
        obj <- ggtern(data=selectedData(), vec)
        if (input$show_point)
            obj <- obj + geom_point()
        if (input$show_dens)
            obj <- obj + stat_density_tern(aes(fill=..level.., alpha=..level..), geom='polygon')
        print(obj)
    })
}

shinyApp(ui = ui, server = server)

Я могу сделать это в basi c R, но при попытке реализовать это как часть Shiny я получаю ошибку, которую не знаю, как исправить.

1 Ответ

0 голосов
/ 10 июля 2020

Чтобы ваше приложение работало, вы можете упростить свой код, избавившись от реавтивных выражений Tx и передав выбранные столбцы напрямую в ggtern через aes_string. Также, чтобы заставить ggtern работать с geom_point или geom_density, мы должны назвать эстетику. Попробуйте это:

server <- function(session,input, output) {
  
  selectedData <- reactive({
    inFile <- input$csv_file
    if (is.null(inFile))
      return(NULL)
    df <- read.csv(inFile$datapath,na.strings = c("", "NA", "#N/A"))
    updateSelectInput(session,"x_val","x series",colnames(df))
    updateSelectInput(session,"y_val","y series",colnames(df))
    updateSelectInput(session,"z_val","z series",colnames(df))
    return(df)
  })
  
  output$ggtern <- renderPlot({
    
    if (is.null(selectedData()))
      return(NULL)
    
    req(input$x_val)
    req(input$y_val)
    req(input$z_val)
    
    obj <- ggtern(data=selectedData(), aes_string(x = input$x_val, y = input$y_val, z = input$z_val))
    
    if (input$show_point)
      obj <- obj + geom_point()
    if (input$show_dens)
      obj <- obj + stat_density_tern(aes(fill=..level.., alpha=..level..), geom='polygon')
    print(obj)
  })
}

введите описание изображения здесь

...