【问题标题】:R-shiny: Discrete value supplied to continuous scaleR-shiny:提供给连续刻度的离散值
【发布时间】:2017-09-25 09:37:14
【问题描述】:

所以我正在使用 mpg 数据集来练习我的 R-shiny 技能,但是我遇到了一个问题。

我想写一个应用程序,我可以选择不同的变量来制作图形,如果它至少涉及一个离散变量,那么我画一个geom_boxplot,否则我就画一个geom_point。

我的 ui.R 看起来像这样:

library(shiny)

shinyUI(fluidPage(

  # Application title
  titlePanel("Old Faithful Geyser Data"),

  # Sidebar with a slider input for number of bins
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "var1",
                  label = "Choose x variable",
                  choices = 
                    names(mpg)
      ),
      selectInput(inputId = "var2",
                  label = "Choose y variable",
                  choices = 
                    names(mpg))
      ),

    # Show a plot of the generated distribution
  mainPanel(
      plotOutput("distPlot")
    )
  )
))

并且 我的 server.R 看起来像这样:

library(shiny)
library(tidyverse)
library(dplyr)

shinyServer(function(input, output) {

  output$distPlot <- renderPlot({

     if(typeof(mpg[, input$var1]) == "chr" ||
        typeof(mpg[, input$var2]) == "chr")
     {
       ggplot(data = mpg) +
         geom_boxplot(mapping =
                          aes(x = mpg[, input$var1],
                              y = mpg[, input$var2])) +
         xlab(input$var1) +
         ylab(input$var2) +
         ggtitle(paste("Plot", input$var1, "vs", input$var2))
     }

     else
     {
      ggplot(data = mpg) +
        geom_point(mapping =
                     aes(x = mpg[, input$var1],
                         y = mpg[, input$var2])) +
        xlab(input$var1) +
        ylab(input$var2) +
        ggtitle(paste("Plot", input$var1, "vs", input$var2))
     }
  })
})

但它根本不起作用!当我选择离散变量时,它会返回一条错误消息,显示“离散值应用于连续比例”。但是,如果我都选择连续值,它似乎工作正常。

为什么会显示这样的错误消息? 请帮我! 非常感谢!

【问题讨论】:

    标签: r ggplot2 shiny


    【解决方案1】:

    你在服务器端有几个问题:

    一个:如果您查看typeof 的示例,您会发现您总是得到一个列表:

    typeof(mpg[,"model"])
    #[1] "list"
    typeof(mpg[,"displ"])
    #[1] "list"
    

    这是因为[ 不提取实际元素,而是提取包含该元素的列表。来自?"["

    按 [ 索引类似于原子向量并选择指定元素的列表。

    您应该使用typeof(mpg[[input$var1]]) 等,因为您要提取列表的元素(而不是包含该元素的列表)。

    两个:

    ggplotaes_string 实际上有一个特定的函数,它根据字符串选择要绘制的列。

    结合这两个更改应该可以使您的闪亮应用正常运行。我还稍微简化了您的服务器以摆脱常见的ggplot 代码。

    server <- function(input,output){
    
      output$distPlot <- renderPlot({
    
        p <- ggplot(mpg) + xlab(input$var1) +
                           ylab(input$var2) +
                           ggtitle(paste("Plot", input$var1, "vs", input$var2))
    
        if(typeof(mpg[[input$var1]]) == "character" |
           typeof(mpg[[input$var2]]) == "character")
        {
          p <- p + geom_boxplot(mapping =
                           aes_string(x = input$var1,
                                      y = input$var2))
        }
    
        else
        {
         p <- p + geom_point(mapping =
                         aes_string(x = input$var1,
                                    y = input$var2))
        }
    
        return(p)
    
      })
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-26
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2015-01-08
      • 2016-07-26
      • 2014-07-06
      • 2019-01-04
      • 2023-01-31
      相关资源
      最近更新 更多