Я работаю над приложением Shiny R, но не понимаю, почему моя функция draw_plot_1 не работает. Потому что данные отображаются только в последнем else. я бы хотел
plot a boxplot when one variable is numeric and the other one is categorical.
Вне блестящего приложения моя функция работает нормально. Любые предложения были бы замечательными!
Вот мой код:
not_sel <- "No selected"
about_page <- tabPanel(
title = "Info",
titlePanel("Info"),
"Creado con R Shiny",
br(),
"Mayo 2022"
)
main_page <- tabPanel(
title = "Analysis",
titlePanel("Analysis"),
sidebarLayout(
sidebarPanel(
title = "Inputs",
fileInput("csv_input", "Select CSV File to Import", accept = ".csv"),
selectInput("num_var_1", "Variable 1", choices = c(not_sel)),
selectInput("num_var_2", "Variable 2", choices = c(not_sel)),
br(),
actionButton("run_button", "Run Analysis", icon = icon("play"))
),
mainPanel(
tabsetPanel(
tabPanel(
title = "Plot",
plotOutput("plot_1")
)
)
)
)
)
draw_plot_1 <- function(data_input, num_var_1, num_var_2){
if (num_var_1 != not_sel & num_var_2 != not_sel)
{
if (is.character(num_var_2) & is.numeric(num_var_1))
{
ggplot(data = data_input,
aes_string(x = num_var_1, y = num_var_2)) +
geom_boxplot()
}
else if (is.character(num_var_1) & is.numeric(num_var_2))
{
ggplot(data = data_input,
aes_string(x = num_var_2, y = num_var_1)) +
geom_boxplot()
}
else
{
ggplot(data = data_input,
aes_string(x = num_var_2, y = num_var_1)) +
geom_point()
}
}
}
ui <- navbarPage(
title = "Data Analyser",
theme = shinytheme('united'),
main_page,
about_page
)
server <- function(input, output){
options(shiny.maxRequestSize=10*1024^2)
data_input <- reactive({
req(input$csv_input)
fread(input$csv_input$datapath)
})
observeEvent(data_input(),{
choices <- c(not_sel,names(data_input()))
updateSelectInput(inputId = "num_var_1", choices = choices)
updateSelectInput(inputId = "num_var_2", choices = choices)
})
num_var_1 <- eventReactive(input$run_button,input$num_var_1)
num_var_2 <- eventReactive(input$run_button,input$num_var_2)
# plot
plot_1 <- eventReactive(input$run_button,{
draw_plot_1(data_input(), num_var_1(), num_var_2())
})
output$plot_1 <- renderPlot(plot_1())
output$num_var_1_title <- renderText(paste("Num Var 1:",num_var_1()))
}
shinyApp(ui = ui, server = server)





Поскольку возвращаемое значение из элемента управления вводом списка выбора является символом. Я приложил один снимок экрана, показывающий значение num_var_1() и num_var_2().
И я бы посоветовал вам вставить функцию browser() для отладки вашего кода, и вы можете запустить код ниже, чтобы лучше понять свой код.
not_sel <- "No selected"
about_page <- tabPanel(
title = "Info",
titlePanel("Info"),
"Creado con R Shiny",
br(),
"Mayo 2022"
)
main_page <- tabPanel(
title = "Analysis",
titlePanel("Analysis"),
sidebarLayout(
sidebarPanel(
title = "Inputs",
fileInput("csv_input", "Select CSV File to Import", accept = ".csv"),
selectInput("num_var_1", "Variable 1", choices = c(not_sel)),
selectInput("num_var_2", "Variable 2", choices = c(not_sel)),
br(),
actionButton("run_button", "Run Analysis", icon = icon("play"))
),
mainPanel(
tabsetPanel(
tabPanel(
title = "Plot",
plotOutput("plot_1")
)
)
)
)
)
draw_plot_1 <- function(data_input, num_var_1, num_var_2){
if (num_var_1 != not_sel & num_var_2 != not_sel)
{
if (is.character(num_var_2) & is.numeric(num_var_1))
{
ggplot(data = data_input,
aes_string(x = num_var_1, y = num_var_2)) +
geom_boxplot()
}
else if (is.character(num_var_1) & is.numeric(num_var_2))
{
ggplot(data = data_input,
aes_string(x = num_var_2, y = num_var_1)) +
geom_boxplot()
}
else
{
ggplot(data = data_input,
aes_string(x = num_var_2, y = num_var_1)) +
geom_point()
}
}
}
ui <- navbarPage(
title = "Data Analyser",
theme = shinytheme('united'),
main_page,
about_page
)
server <- function(input, output){
options(shiny.maxRequestSize=10*1024^2)
data_input <- reactive({
req(input$csv_input)
fread(input$csv_input$datapath)
})
observeEvent(data_input(),{
choices <- c(not_sel,names(data_input()))
updateSelectInput(inputId = "num_var_1", choices = choices)
updateSelectInput(inputId = "num_var_2", choices = choices)
})
num_var_1 <- eventReactive(input$run_button,input$num_var_1)
num_var_2 <- eventReactive(input$run_button,input$num_var_2)
# plot
plot_1 <- eventReactive(input$run_button,{
draw_plot_1(data_input(), num_var_1(), num_var_2())
})
output$plot_1 <- renderPlot(plot_1())
output$num_var_1_title <- renderText(paste("Num Var 1:",num_var_1()))
}
shinyApp(ui = ui, server = server)
Вы можете напрямую использовать data_input()[[num_var_1()]] для извлечения соответствующего столбца num_var_1().
Благодарю вас! Что бы вы порекомендовали мне сделать, чтобы проверить, является ли переменная категориальной или числовой? Как я могу назвать реальный столбец?