r - Shiny中的对象问题
问题描述
我在尝试创建 Shiny 应用时遇到问题。有了这张表:
data <- data.frame(
variable1 = c('S','S','S','N','N','N'),
variable2 = c('S','S','N','N','N','N'),
TYPE = c('REAL','ESTUDIO','REAL','ESTUDIO','REAL','ESTUDIO')
)
用户界面:
ui <- fluidPage(
selectInput(inputId = "variable",
label = "Variable:",
choices = c("variable1","variable2"),
selected = "variable1"),
selectInput(inputId = "medida",
label = "Medida:",
choices = c("Mix","Freq"),
selected = "Mix"),
plotOutput("plot"))
服务器:
server <- function(input, output) {
dateRangeInput<-reactive({
dataset = data %>%
group_by(variable1,TYPE) %>%
summarise(Freq=n()) %>%
inner_join(data %>%
group_by(TYPE) %>%
summarise(Freq_Tot=n())
,
by="TYPE") %>%
mutate(Mix=Freq/Freq_Tot)
dataset
})
output$plot <-renderPlot({
ggplot(data=dateRangeInput(),
aes_string(x=input$variable,
y=input$medida,
fill="TYPE")) +
geom_bar(stat="identity",
position="dodge")
})
}
它工作正常(我认为这不是历史上最好的 R 代码,我只是在学习),如果我运行最终代码:
shinyApp (ui = ui, server = server)
结果:
如您所见,我制作了一个简单的应用程序(我才刚刚开始),所以我希望得到带有我在 UI 中选择的变量的图表。因此,当我进行这些更改时:
- 在服务器代码中,当我通过变量“variable1”定义组中使用的 dateRangeInput 时。
现在我把 input$variable 改为。
dateRangeInput<-reactive({ dataset = data %>% group_by(input$variable,TYPE) %>% summarise(Freq=n()) %>% inner_join(data %>% group_by(TYPE) %>% summarise(Freq_Tot=n()) , by="TYPE") %>% mutate(Mix=Freq/Freq_Tot) dataset })
它导致此错误:
我认为代码没有将输出理解为变量。我试图用开关功能修复它,但它没有用。
解决方案
在我看来,问题似乎是变量的原始计数。那是因为您上面的代码只考虑 variable1 而不是两个变量,这意味着如果要求变量 2,闪亮的应用程序将出错。
在为非大数据构建闪亮的应用程序时,我通常会创建一个脚本来尽我所能在没有反应性元素的情况下进行操作。在这种情况下,这会给我以下信息:
library(shiny)
library(tidyverse)
data <- tibble(
variable1 = c('S','S','S','N','N','N'),
variable2 = c('S','S','N','N','N','N'),
TYPE = c('REAL','ESTUDIO','REAL','ESTUDIO','REAL','ESTUDIO')
)
data1 <- data %>%
transmute_all(as_factor)
data_tidy <- data1 %>%
gather(
key = "Variable",
value = "value",
-TYPE
)
...生成:
# A tibble: 12 x 3
TYPE Variable value
<fct> <chr> <chr>
1 REAL variable1 S
2 ESTUDIO variable1 S
3 REAL variable1 S
4 ESTUDIO variable1 N
5 REAL variable1 N
6 ESTUDIO variable1 N
7 REAL variable2 S
8 ESTUDIO variable2 S
9 REAL variable2 N
10 ESTUDIO variable2 N
11 REAL variable2 N
12 ESTUDIO variable2 N
然后我们可以总结这些数据:
data_summary_Freq <- data_tidy %>%
count(TYPE, Variable, value, name = "Freq")
data_summary_Total <- data_summary_Freq %>%
group_by(Variable, TYPE) %>%
summarise(total = sum(Freq))
data_summary <- data_summary_Freq %>%
left_join(
data_summary_Total,
by = c("Variable", "TYPE")
) %>%
mutate(Mix = Freq / total) %>%
gather("Output", "Number", -TYPE, -Variable, -value, -total)
...并生成以下结果data_summary
:
# A tibble: 16 x 6
TYPE Variable value total Output Number
<fct> <chr> <chr> <int> <chr> <dbl>
1 REAL variable1 N 3 Freq 1
2 REAL variable1 S 3 Freq 2
3 REAL variable2 N 3 Freq 2
4 REAL variable2 S 3 Freq 1
5 ESTUDIO variable1 N 3 Freq 2
6 ESTUDIO variable1 S 3 Freq 1
7 ESTUDIO variable2 N 3 Freq 2
8 ESTUDIO variable2 S 3 Freq 1
9 REAL variable1 N 3 Mix 0.333
10 REAL variable1 S 3 Mix 0.667
11 REAL variable2 N 3 Mix 0.667
12 REAL variable2 S 3 Mix 0.333
13 ESTUDIO variable1 N 3 Mix 0.667
14 ESTUDIO variable1 S 3 Mix 0.333
15 ESTUDIO variable2 N 3 Mix 0.667
16 ESTUDIO variable2 S 3 Mix 0.333
剩下的问题是围绕这个数据框构建闪亮的代码。
总的来说,这意味着:
library(shiny)
library(tidyverse)
data <- tibble(
variable1 = c('S','S','S','N','N','N'),
variable2 = c('S','S','N','N','N','N'),
TYPE = c('REAL','ESTUDIO','REAL','ESTUDIO','REAL','ESTUDIO')
)
data1 <- data %>%
transmute_all(as_factor)
data_tidy <- data1 %>%
gather(
key = "Variable",
value = "value",
-TYPE
)
data_summary_Freq <- data_tidy %>%
count(TYPE, Variable, value, name = "Freq")
data_summary_Total <- data_summary_Freq %>%
group_by(Variable, TYPE) %>%
summarise(total = sum(Freq))
data_summary <- data_summary_Freq %>%
left_join(
data_summary_Total,
by = c("Variable", "TYPE")
) %>%
mutate(Mix = Freq / total) %>%
gather("Output", "Number", -TYPE, -Variable, -value, -total)
ui <- fluidPage(
selectInput(inputId = "variable",
label = "Variable:",
choices = c("variable1","variable2"),
selected = "variable1"),
selectInput(inputId = "medida",
label = "Medida:",
choices = c("Mix","Freq"),
selected = "Mix"),
plotOutput("plot")
)
server <- function(input, output) {
dateRangeInput <- reactive({
data_summary %>%
filter(
Variable == input$variable,
Output == input$medida
)
})
output$plot <-renderPlot({
dateRangeInput() %>%
ggplot() +
geom_bar(
aes(
x = value,
y = Number,
group = TYPE,
fill = TYPE
),
stat = "identity",
position = "dodge"
) +
labs(
title = paste(input$medida, "information about", input$variable)
)
})
}
shinyApp (ui = ui, server = server)
...生成这个应用程序,我已上传到shinyapps.io。
我希望我已经正确理解了您的问题并且这会有所帮助。
一切顺利 ...
推荐阅读
- sql-server - SSAS 表格模型 - 多个事实表
- java - 我可以使用 identityHashCode 在尊重相同性的对象之间生成 compareTo 吗?
- ios - Swift - didSet 属性未从绑定更改中调用
- javascript - 来自消息事件的工作箱缓存 URL
- flutter - 无法导入字体真棒颤振?
- .net - IMemorycache 不断调用服务器上的 sql
- google-cloud-firestore - “firestore”的“CreateTime”和“UpdateTime”不能作为搜索条件吗?
- swift - 在 xcode 12.2 上构建 jitsiMeet SDK 2.11.0 时遇到问题
- r - R 数据操作:更改数据框中的值。错误的数学解决方案
- c++ - 在 C++ 中访问映射中的第一对和第二对时出现编译器错误