在Shiny中为checkboxGroupInput添加if语句

时间:2016-04-15 18:32:39

标签: r ggplot2 shiny

我在闪亮的应用中添加复选框时遇到问题。我希望能够检查添加线性回归线,黄土或根本没有。这是使用钻石数据。 任何帮助将不胜感激:

ui.R

library(shiny)
shinyUI(fluidPage(
fluidRow(
sidebarLayout(
  sidebarPanel(
    numericInput("size","Size",value=1,min=0,max=1,step=0.1),
    sliderInput("opaqueness","Opaqueness",0,min=0,max=1),
    checkboxInput("color","Color",value=T),
    checkboxGroupInput("lines","Lines",choices=c("lm","loess"))
    #add inputs

    ),
  mainPanel(
    plotOutput("diamondgraph")
  )
)
)
))

server.R

library(dplyr)
library(ggplot2)
library(shiny)
data<-diamonds
data<-filter(data,color=="E"|color=="I"|color=="J")


shinyServer(function(input, output) {
  output$diamondgraph<-renderPlot({
g<-ggplot(data=data,aes(x=carat,y=price))
if (input$color){
  gcol<-g+geom_point(aes(color=color),alpha=input$opaqueness,size=input$size)+scale_x_log10()+
    ggtitle("Scatterplot of Carat vs Price")

}else{
  gcol<-g+geom_point(alpha=input$opaqueness, size=input$size)+
    geom_smooth()+
    scale_x_log10()+
    ggtitle("Scatterplot of Carat vs Price")
}
if (input$lines =="lm"){
  gcol<-g+geom_point(aes(color=color),alpha=input$opaqueness,size=input$size)+geom_smooth(aes(color=color, method=lm))+scale_x_log10()+
    ggtitle("Scatterplot of Carat vs Price")
}
if 
(input$lines == "loess"){
  gcol<-g+geom_point(aes(color=color),alpha=input$opaqueness,size=input$size)+geom_smooth(aes(color=color)) + scale_x_log10()+
    ggtitle("Scatterplot of Carat vs Price")
} else 
  gcol<-g+geom_point(aes(color=color),alpha=input$opaqueness,size=input$size) + scale_x_log10()+
    ggtitle("Scatterplot of Carat vs Price")
gcol
   })

})

1 个答案:

答案 0 :(得分:1)

要确定问题并不容易,因为你有很多代码重复,并且你的格式很难解析。如果您正在使用RStudio Ctrl + I并且Ctrl + Shift + A将重新缩进您的行并重新格式化您的代码。以下是我注意到的一些问题:

  1. 未使用input$color设置,因为检查input$lines值的其他逻辑只是用aes(color=color)覆盖它。当您分解出大量重复代码时,这更容易看到。
  2. checkboxGroupInput("lines","Lines",choices=c("lm","loess"))应该是radioButton。这两件事同时成立是没有意义的。
  3. 使用合理的默认值,例如将input$opaqueness设置为初始值大于零。
  4. 以下版本对我来说运行正常:

    library(dplyr)
    library(ggplot2)
    library(shiny)
    
    data <- diamonds
    data <- filter(data, color == "E" | color == "I" | color == "J")
    set.seed(123)
    data <- data[sample(seq_len(nrow(data)), 3000),]
    
    shinyApp(
        ui = fluidPage(fluidRow(
            sidebarLayout(
                sidebarPanel(
                    numericInput(
                        "size", "Size", 
                        value = 1, 
                        min = 0,
                        max = 1,
                        step = 0.1
                    ),
    
                    sliderInput(
                        "opaqueness", "Opaqueness",
                        min = 0, max = 1, value = 0.5
                    ),
    
                    checkboxInput(
                        "color", "Color",
                        value = TRUE
                    ),
    
                    radioButtons(
                        "lines", "Lines",
                        choices = c("lm", "loess", "none"),
                        selected = "none"
                    )
                ),
    
                mainPanel(plotOutput("diamondgraph"))
            )
        )),
    
        server = function(input, output) {
    
            output$diamondgraph <- renderPlot({
                g <- ggplot(data = data, aes(x = carat, y = price))
    
                if (input$color) {
                    g <- g + geom_point(
                        aes(color = color),
                        alpha = input$opaqueness, 
                        size = input$size)
    
                    if (input$lines != "none") {
                        g <- g + geom_smooth(
                            aes(color = color),
                            method = input$lines)
                    }
    
                } else {
                    g <- g + geom_point(alpha = input$opaqueness,
                                        size = input$size)
    
                    if (input$lines != "none") {
                        g <- g + geom_smooth(method = input$lines)
                    }
                }
    
                g + scale_x_log10() +
                    ggtitle("Scatterplot of Carat vs Price")
    
            })
        }
    )