Shinydashboard应用中函数无法交互式运行的解决方法咨询
问题解决方法
你遇到的问题核心是Shiny的输入控件无法直接传递函数对象,selectizeInput会把传入的函数转为字符串存储,导致后续调用时无法识别为函数。以下是修正方案:
具体修改步骤
- 调整UI的选择项:将
selectizeInput的choices改为字符串标识,而非直接传入函数 - 创建函数映射表:在server端建立字符串与对应函数的关联,方便根据选择调用
- 动态调用函数:在数据处理逻辑中,通过选择的字符串从映射表中获取函数并执行
修正后的完整代码
library(shiny) library(shinydashboard) library(tidyquant) library(tidyverse) library(plotly) annual <- function(x){ (x/lag(x, 12) - 1)*100 } monthly <- function(x){ (x/lag(x) - 1)*100 } ui <- dashboardPage( dashboardHeader(title = 'Dashboard'), dashboardSidebar(), dashboardBody( fluidRow( box(selectizeInput('select_calculation', 'Calculation', choices = c('Monthly' = 'monthly', 'Annual' = 'annual') # 改为字符串标识 ), height=80,width=4) ), fluidRow( box(plotlyOutput("chart")) ) ) ) server <- function(input, output) { # 创建函数映射列表,将字符串与对应函数绑定 func_map <- list( monthly = monthly, annual = annual ) output$chart <- renderPlotly({ chart <- tidyquant::tq_get('PCE', from = '2019-01-01', to = '2022-10-01', get = 'economic.data') %>% select(-symbol) %>% mutate_if(is.numeric, ~func_map[[input$select_calculation]](.)) %>% # 从映射表取函数调用 drop_na() %>% ggplot(aes(x = date, y = price)) + geom_line() %>% ggplotly() }) } shinyApp(ui, server)
关键说明
- 把
choices改成字符串后,Shiny能正确传递选择项的标识 func_map列表作为字符串到函数的桥梁,确保能根据用户选择获取对应的计算函数mutate_if中使用func_map[[input$select_calculation]]动态取出函数,再传入数据执行计算
内容的提问来源于stack exchange,提问作者Tanga94
相关产品推荐
相关产品推荐

