R-shiny:提供连续刻度的离散值

时间:2017-09-24 23:49:42

标签: r ggplot2 shiny

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

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

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

    render(){
        return (
                <div>
                  <input id="search-input" onChange={this.handleTermChange} autoFocus/>
                  <a id="search" onClick={this.search}>SEARCH</a>
                </div>
        );
    }

和 我的server.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")
    )
  )
))

但它根本行不通!当我选择离散变量时,它会返回一条错误消息,表示&#34;离散值应用于连续刻度&#34;。但是,如果我选择连续值,那么它似乎工作正常。

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

1 个答案:

答案 0 :(得分: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)

  })
}