Shiny仪表盘国际化报错:$ operator is invalid for atomic vectors
多语言Shiny仪表盘报错:$运算符对原子向量无效的解决方法
问题场景
尝试基于shiny.i18n包制作支持多语言的Shiny仪表盘,使用以下JSON翻译配置:
{ "languages": ["en", "pl", "hr"], "translation": [ { "en": "MtCars Dataset Explorer", "pl": "Eksplorator danych: MtCars", "hr": "Istraživanje MtCars Dataseta" }, { "en": "Change language", "pl": "Wybierz język", "hr": "Promijeni jezik" }, { "en": "Select", "pl": "Wybierz", "hr": "Odaberi" }, { "en": "This is description of the plot.", "pl": "To jest opis obrazka.", "hr": "Ovo je opis grafikona." }, { "en": "Scatter plot", "pl": "Wykres punktowy", "hr": "Dijagram raspršenja" }, { "en": "X-Axis", "pl": "Oś X", "hr": "X os" }, { "en": "Y-Axis", "pl": "Oś Y", "hr": "Y os" } ] }
对应的R代码如下:
## load libraries library(ggplot2) library(ggpubr) library(extrafont) library(shiny) library(shinydashboard) library(shiny.i18n) ## UI translation i18n <- Translator$new(translation_json_path = "./trans1.json") # load translation file i18n$set_translation_language("en") # set default language ui <- fluidPage( shiny.i18n::usei18n(i18n), tags$div( style='float: right;', selectInput( inputId='selected_language', label=i18n$t('Change language'), choices = i18n$get_languages(), selected = i18n$get_key_translation() ) ), titlePanel(i18n$t('MtCars Dataset Explorer'), windowTitle=NULL), sidebarLayout( sidebarPanel( width=3, tags$h4(i18n$t('Select')), varSelectInput( inputId='x_select', label=i18n$t('X-Axis'), data=mtcars ), varSelectInput( inputId='y_select', label=i18n$t('Y-Axis'), data=mtcars ) ), mainPanel( plotOutput(outputId='scatter'), tags$p(i18n$t('This is description of the plot.')) ) ) ) server <- function(input, output, session) { observeEvent(input$selected_language, { update_lang(session, input$selected_language) }) output$scatter <- renderPlot({ col1 <- sym(input$x_select) col2 <- sym(input$y_select) ggplot(mtcars, aes(x= !! col1, y= !! col2)) + geom_point(size=6) + ggtitle(i18n$t('Scatter plot')) }) } app <- shinyApp(ui=ui, server=server)
运行runApp(app)时出现错误:
Warning: Error in $: $ operator is invalid for atomic vectors
移除selectInput相关代码后程序可正常运行,is.atomic(i18n)返回[1] FALSE。
错误原因
问题出在selectInput的selected参数设置:
i18n$get_key_translation()方法返回的是所有翻译键的原子向量(即JSON中translation数组里的所有英文键),而不是当前设置的语言代码。selectInput的selected参数需要单个语言代码(如"en"),传入原子向量会导致初始化时出现$运算符对原子向量无效的错误。
另外,需确保shiny.i18n包为最新版本,旧版本可能存在方法命名或功能差异。
解决方案
- 替换错误的方法调用:将
selected = i18n$get_key_translation()改为selected = i18n$get_translation_language(),该方法返回当前设置的默认语言代码。 - 更新依赖包:执行
install.packages("shiny.i18n")确保使用最新版本。
修正后的完整代码
## load libraries library(ggplot2) library(ggpubr) library(extrafont) library(shiny) library(shinydashboard) library(shiny.i18n) ## UI translation i18n <- Translator$new(translation_json_path = "./trans1.json") # load translation file i18n$set_translation_language("en") # set default language ui <- fluidPage( shiny.i18n::usei18n(i18n), tags$div( style='float: right;', selectInput( inputId='selected_language', label=i18n$t('Change language'), choices = i18n$get_languages(), selected = i18n$get_translation_language() # 修正此处 ) ), titlePanel(i18n$t('MtCars Dataset Explorer'), windowTitle=NULL), sidebarLayout( sidebarPanel( width=3, tags$h4(i18n$t('Select')), varSelectInput( inputId='x_select', label=i18n$t('X-Axis'), data=mtcars ), varSelectInput( inputId='y_select', label=i18n$t('Y-Axis'), data=mtcars ) ), mainPanel( plotOutput(outputId='scatter'), tags$p(i18n$t('This is description of the plot.')) ) ) ) server <- function(input, output, session) { observeEvent(input$selected_language, { update_lang(session, input$selected_language) }) output$scatter <- renderPlot({ col1 <- sym(input$x_select) col2 <- sym(input$y_select) ggplot(mtcars, aes(x= !! col1, y= !! col2)) + geom_point(size=6) + ggtitle(i18n$t('Scatter plot')) }) } app <- shinyApp(ui=ui, server=server)
内容的提问来源于stack exchange,提问作者leroux
相关产品推荐
相关产品推荐

