所以我使用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;。但是,如果我选择连续值,那么它似乎工作正常。
为什么会显示这样的错误消息? 请帮我! 非常感谢你!
答案 0 :(得分:1)
在服务器端,您有几个问题:
一个:如果您查看typeof
的示例,您会看到总是有一个列表:
typeof(mpg[,"model"])
#[1] "list"
typeof(mpg[,"displ"])
#[1] "list"
这是因为[
不提取实际元素,而是提取包含该元素的列表。来自?"["
:
索引[类似于原子向量并选择指定元素的列表。
相反,您应该使用typeof(mpg[[input$var1]])
等,因为您想要提取列表的元素(而不是包含该元素的列表)。
<强>两个强>
ggplot
,aes_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)
})
}