You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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包为最新版本,旧版本可能存在方法命名或功能差异。

解决方案

  1. 替换错误的方法调用:将selected = i18n$get_key_translation()改为selected = i18n$get_translation_language(),该方法返回当前设置的默认语言代码。
  2. 更新依赖包:执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:30:42