R selectInput 反应性问题
R selectInput reactivity issues
我在 Shiny 中遇到反应问题。在我的 UI 中,我有
library(tidyverse)
library(shiny)
library(forcats)
ui <- fluidPage(
titlePanel(h1("Percent Cover")),
selectInput("selectInput", "Select Site", choices = c("A", "B", "C", "D")),
plotOutput("coverTypeBarChart", height = "600px")
)
这些对应于我在服务器顶部读入的数据帧 A、B、C、D。
在我的服务器中,我有:
colors <- c("red", "blue", "green", "purple")
reactive({
if (input$selectInput == "A")
{data <- A}
else if (input$selectInput == "B")
{data <- B}
else if (input$selectInput == "C")
{data <- C}
else if (input$selectInput == "D")
{data <- D}
})
data() <- na.omit(as.data.frame(data()$cover_group))
names(data()) <- c("tmp")
cover_group_factor <- as.factor(data()$tmp)
cover_group_factor <- fct_recode(cover_group_factor, OTHER = "E", OTHER = "F", OTHER = "G", OTHER = "H", OTHER = "I", OTHER = "J", OTHER = "K")
bar <- ggplot(data = data()) +
geom_bar(mapping = aes(x = cover_group_factor, y = ..count../sum(..count..)), fill = colors) + xlab("Cover Group") + ylab("Percent")
observe({
output$coverTypeBarChart <- renderPlot(bar)
})
}
我知道当我手动将数据分配给任何值并手动 运行 代码时,我可以生成绘图,所以我知道这是一个反应性问题。
谢谢。
我同意 p0bs - 您需要将 reactive
表达式的结果分配给一个变量。
此外,嵌套的 if...else
语句具有特定的语法。 else
必须与 if
语句的右大括号在同一行。
以下可能有用:
data <- reactive({
if(input$selectInput == "A"){
A
} else if(input$selectInput == "B") {
B
} else if(input$selectInput == "C") {
C
} else if(input$selectInput == "D") {
D
}
})
我最近不得不解决类似的问题。下面这个例子,我编了一些数据:
library(shiny)
library(ggplot2)
set.seed(1)
A <- sample_frac(mtcars,0.2) %>% select(cyl)
B <- sample_frac(mtcars,0.2) %>% select(cyl)
C <- sample_frac(mtcars,0.2) %>% select(cyl)
D <- sample_frac(mtcars,0.2) %>% select(cyl)
这是最简单的 ui
版本,它有一个 input
和 output
:
ui <- fluidPage(
selectInput("choice", "Select Site", choices = c("A", "B", "C", "D")),
plotOutput("barchart", height = "600px")
)
我使用的技巧是 name
和 get
检索您想要的 data.frame。例如:
get("A")
cyl
Merc 230 4
Merc 450SE 8
Fiat 128 4
Porsche 914-2 4
Valiant 6
Pontiac Firebird 8
在 server
的上下文中:
server <- function( input, output ) {
output$barchart <- renderPlot(ggplot(data = get(input$choice), aes(cyl)) + geom_bar())
}
正如您在我上面的 ggplot
语句中看到的,我正在使用 get
.
检索 input$choice
给出的数据
我在 Shiny 中遇到反应问题。在我的 UI 中,我有
library(tidyverse)
library(shiny)
library(forcats)
ui <- fluidPage(
titlePanel(h1("Percent Cover")),
selectInput("selectInput", "Select Site", choices = c("A", "B", "C", "D")),
plotOutput("coverTypeBarChart", height = "600px")
)
这些对应于我在服务器顶部读入的数据帧 A、B、C、D。
在我的服务器中,我有:
colors <- c("red", "blue", "green", "purple")
reactive({
if (input$selectInput == "A")
{data <- A}
else if (input$selectInput == "B")
{data <- B}
else if (input$selectInput == "C")
{data <- C}
else if (input$selectInput == "D")
{data <- D}
})
data() <- na.omit(as.data.frame(data()$cover_group))
names(data()) <- c("tmp")
cover_group_factor <- as.factor(data()$tmp)
cover_group_factor <- fct_recode(cover_group_factor, OTHER = "E", OTHER = "F", OTHER = "G", OTHER = "H", OTHER = "I", OTHER = "J", OTHER = "K")
bar <- ggplot(data = data()) +
geom_bar(mapping = aes(x = cover_group_factor, y = ..count../sum(..count..)), fill = colors) + xlab("Cover Group") + ylab("Percent")
observe({
output$coverTypeBarChart <- renderPlot(bar)
})
}
我知道当我手动将数据分配给任何值并手动 运行 代码时,我可以生成绘图,所以我知道这是一个反应性问题。
谢谢。
我同意 p0bs - 您需要将 reactive
表达式的结果分配给一个变量。
此外,嵌套的 if...else
语句具有特定的语法。 else
必须与 if
语句的右大括号在同一行。
以下可能有用:
data <- reactive({
if(input$selectInput == "A"){
A
} else if(input$selectInput == "B") {
B
} else if(input$selectInput == "C") {
C
} else if(input$selectInput == "D") {
D
}
})
我最近不得不解决类似的问题。下面这个例子,我编了一些数据:
library(shiny)
library(ggplot2)
set.seed(1)
A <- sample_frac(mtcars,0.2) %>% select(cyl)
B <- sample_frac(mtcars,0.2) %>% select(cyl)
C <- sample_frac(mtcars,0.2) %>% select(cyl)
D <- sample_frac(mtcars,0.2) %>% select(cyl)
这是最简单的 ui
版本,它有一个 input
和 output
:
ui <- fluidPage(
selectInput("choice", "Select Site", choices = c("A", "B", "C", "D")),
plotOutput("barchart", height = "600px")
)
我使用的技巧是 name
和 get
检索您想要的 data.frame。例如:
get("A")
cyl
Merc 230 4
Merc 450SE 8
Fiat 128 4
Porsche 914-2 4
Valiant 6
Pontiac Firebird 8
在 server
的上下文中:
server <- function( input, output ) {
output$barchart <- renderPlot(ggplot(data = get(input$choice), aes(cyl)) + geom_bar())
}
正如您在我上面的 ggplot
语句中看到的,我正在使用 get
.
input$choice
给出的数据