闪亮的条件语句
Shiny Conditional Statements
我在 Shiny 中使用条件语句时遇到问题。我希望用户能够 select Y 值的数据,这将更改显示的图表类型。当数据类型为数字时,图表显示正常。但是当数据类型是文本时,我希望图表更改为直方图并只计算实例数。我正在处理的两个场景是 selected 类别中的合同支出与 selected 类别中的合同数量。我的服务器代码如下。我只需要能够根据值 selected.
将图表类型从条形图切换为直方图
library(shiny)
library(ggplot2)
shinyServer(function(input, output) {
spend <- read.csv("C:/Users/William/Documents/First_Rstudio/App-1/data/CENTCOMdata.csv")
output$GovSpend <- renderPlot({
spend <- spend[spend$Contracting.Agency.Name == input$agency,]
if(typeof(input$yval) = "double"){ggplot(spend, aes_string(x = input$xlab, y = ylab fill = "Tier.1.Contract.Category")) +
geom_bar(na.rm = TRUE, stat= "identity")
}
else {ggplot(spend, aes_string(x = input$xlab, fill= "Tier.1.Contract.Category")) +
geom_bar()}
})
})
每张图都可以单独使用。我就是无法使 if 语句正常工作。当它呈现到网络时,它始终默认为直方图,而不管数据类型 selected for yval 或者哪个在 if 语句中首先出现。
UI 在这里:
library(shiny)
spend <- read.csv("C:/Users/William/Documents/First_Rstudio/App-1/data/CENTCOMdata.csv")
shinyUI(fluidPage(
titlePanel("All Gov't Spend"),
sidebarLayout(
sidebarPanel(
selectInput("xlab", label = "Select X Values",
choices = colnames(spend),
selected = "FY"
),
selectInput("yval", label = "Select y Values",
choices = colnames(spend),
selected = "Action_Absolute_Value"
),
selectInput("agency", label = "Select Agency",
choices = levels(spend$Contracting.Agency.Name)
),
selectInput("Country", label = "Select Country",
choices = levels(spend$Principal.Place.of.Performance.Country.Name))
),
mainPanel(plotOutput("GovSpend")
)
)
))
来自 HTML 元素的用户输入值始终是字符串。所以无论 input$yval=="Action.Obligation"
还是 input$yval=="Tier.1.Contract.Category"
input$yval
总是一个字符,永远不会加倍。您不想检查 input$yval
的类型,而是想检查 spend[[input$yval]]
的数据类型,因为这实际上会查看 data.frame 中的列。我建议您将 if 语句更改为
if ( is.numeric(spend[[input$yval]]) ) {
ggplot(spend, aes_string(x = input$xlab, y = ylab fill ="Tier.1.Contract.Category")) +
geom_bar(na.rm = TRUE, stat= "identity")
} else {
ggplot(spend, aes_string(x = input$xlab, fill= "Tier.1.Contract.Category")) +
geom_bar()
}
我在 Shiny 中使用条件语句时遇到问题。我希望用户能够 select Y 值的数据,这将更改显示的图表类型。当数据类型为数字时,图表显示正常。但是当数据类型是文本时,我希望图表更改为直方图并只计算实例数。我正在处理的两个场景是 selected 类别中的合同支出与 selected 类别中的合同数量。我的服务器代码如下。我只需要能够根据值 selected.
将图表类型从条形图切换为直方图library(shiny)
library(ggplot2)
shinyServer(function(input, output) {
spend <- read.csv("C:/Users/William/Documents/First_Rstudio/App-1/data/CENTCOMdata.csv")
output$GovSpend <- renderPlot({
spend <- spend[spend$Contracting.Agency.Name == input$agency,]
if(typeof(input$yval) = "double"){ggplot(spend, aes_string(x = input$xlab, y = ylab fill = "Tier.1.Contract.Category")) +
geom_bar(na.rm = TRUE, stat= "identity")
}
else {ggplot(spend, aes_string(x = input$xlab, fill= "Tier.1.Contract.Category")) +
geom_bar()}
})
})
每张图都可以单独使用。我就是无法使 if 语句正常工作。当它呈现到网络时,它始终默认为直方图,而不管数据类型 selected for yval 或者哪个在 if 语句中首先出现。
UI 在这里:
library(shiny)
spend <- read.csv("C:/Users/William/Documents/First_Rstudio/App-1/data/CENTCOMdata.csv")
shinyUI(fluidPage(
titlePanel("All Gov't Spend"),
sidebarLayout(
sidebarPanel(
selectInput("xlab", label = "Select X Values",
choices = colnames(spend),
selected = "FY"
),
selectInput("yval", label = "Select y Values",
choices = colnames(spend),
selected = "Action_Absolute_Value"
),
selectInput("agency", label = "Select Agency",
choices = levels(spend$Contracting.Agency.Name)
),
selectInput("Country", label = "Select Country",
choices = levels(spend$Principal.Place.of.Performance.Country.Name))
),
mainPanel(plotOutput("GovSpend")
)
)
))
来自 HTML 元素的用户输入值始终是字符串。所以无论 input$yval=="Action.Obligation"
还是 input$yval=="Tier.1.Contract.Category"
input$yval
总是一个字符,永远不会加倍。您不想检查 input$yval
的类型,而是想检查 spend[[input$yval]]
的数据类型,因为这实际上会查看 data.frame 中的列。我建议您将 if 语句更改为
if ( is.numeric(spend[[input$yval]]) ) {
ggplot(spend, aes_string(x = input$xlab, y = ylab fill ="Tier.1.Contract.Category")) +
geom_bar(na.rm = TRUE, stat= "identity")
} else {
ggplot(spend, aes_string(x = input$xlab, fill= "Tier.1.Contract.Category")) +
geom_bar()
}