默认 return 如果验证函数未验证

Default return if validate function not validated

我正在使用 google-auth 和国际化构建闪亮的应用程序,所以我使用 googleauthrshiny.i18n。我希望在我的应用程序中注册并在下次选择特定语言的用户获得所需语言的应用程序,但如果该用户是新用户或用户甚至没有授权,他必须获得应用程序的默认语言。

我的应用有代码:

# Libraries ====
library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(shinyWidgets)
library(shinyjs)
library(shiny.i18n)
library(shiny.semantic)
library(shiny.router)
library(shinycssloaders)
library(googleAuthR)
library(googlesheets)
library(kableExtra)
library(waiter)
library(stringr)
library(stringi)
library(dplyr)
# Authorization ====
options(
   googleAuthR.webapp.client_id = 'appid',
   googleAuthR.webapp.client_secret = 'secretid',
   shiny.port = 7777
)
# Header ====
Header <- dashboardHeaderPlus(
   title = 'App',
   titleWidth = 282.75,
   disable = FALSE,
   enable_rightsidebar = TRUE,
   rightSidebarIcon = 'user',
   fixed = FALSE
)
# Sidebar ====
Sidebar <- dashboardSidebar(
   disable = FALSE,
   width = 325,
   collapsed = FALSE,
   sidebarMenuOutput(outputId = 'SidebarMenu')
)
# Body ====
Body <- dashboardBody(
   includeCSS(path = 'www/style.css'),
   uiOutput(outputId = 'Home')
)
# Right Sidebar ====
RightSidebar <- rightSidebar(
   background = 'light',
   rightSidebarTabContent(
      id = 'SignInTab',
      title = 'Account',
      active = TRUE,
      icon = icon(name = 'user'),
      googleSignInUI(id = 'GoogleLogin')
   )
)
# User Interface ====
UI <- dashboardPagePlus(
   header = Header,
   sidebar = Sidebar,
   body = Body,
   rightsidebar = RightSidebar,
   title = 'App',
   skin = 'red',
   collapse_sidebar = FALSE,
   sidebar_background = 'light',
   sidebar_fullCollapse = TRUE,
   enable_preloader = TRUE,
   loading_duration = 0.25,
   md = TRUE
)
# Server ====
Server <- function(
   input,
   output,
   session
) {
   # Data ====
   Locale <- Translator$new(translation_json_path = 'translation.json')
   # User Info ====
   UserInfo <- callModule(
      module = googleSignIn,
      id = 'GoogleLogin'
   )
   User <- reactive({
         validate(need(
               expr = UserInfo(),
               message = 'You\'re not logged in'
            ))
         paste0(
            'ID',
            UserInfo()$id
         )
      })
   ReactiveLocale <- reactive({
         if(is.na(x = User())) {
            Locale$set_translation_language('en')
         } else {
            if(nrow(
                  x = gs_read(
                     ss = gs_title(x = 'Players'),
                     ws = 'PlayersList'
                  ) %>%
                  filter(PlayerID == User())
               ) != 0) {
               Locale$set_translation_language(
                  gs_read(
                     ss = gs_title(x = 'Players'),
                     ws = 'PlayersList'
                  ) %>%
                     filter(PlayerID == User()) %>% 
                     pull(PlayerLocale)
               )
            } else {
               Locale$set_translation_language('en')
            }
         }
      })
   # Body ====
   output$Home <- renderUI({
         validate(need(
               expr = ReactiveLocale(),
               message = 'You\'re not logged in'
            ))
         fluidPage(fluidRow(box(title = Locale$t('CMM001'))))
      }
   )}

# Shiny ====
shinyApp(
   ui = UI,
   server = Server
)

我正在尝试使用 ReactiveLocale 反应函数获取默认语言。

因此,如果用户已注册(因此用户 ID 存在于我的 googlesheet 数据库中),则语言必须来自此 sheet。但是,如果用户已授权但未注册(数据库中不存在用户 ID),则语言必须是英语。 所以,这 2 个案例在 ReactiveLocale 对我有用 但第三种情况 - 当用户未授权时对我不起作用。 所以我在这部分代码中的问题:

if(is.na(x = User())) {
   Locale$set_translation_language('en')
}

我用 is.null 函数试过了,但它对我也不起作用。 我将如何更改我的代码以获得这 3 个工作案例?

您的代码无法正常工作的原因是 User()(静默地)在 UserInfo() 为假时引发错误。那就是 returns 一个错误(不是 NANULL)。

您有不同的选择来解决这个问题。您可以将验证部分移至 ReactiveLocale,或者您使用 tryCatch 方法,如本玩具示例所示:

ui <- fluidPage(verbatimTextOutput("out_error"),
                verbatimTextOutput("out_catch"))

server <- function(input, output, session) {
   get_user <- reactive(validate(need(FALSE, "User needed")))
   output$out_error <- renderPrint(get_user())
   output$out_catch <- renderPrint(tryCatch(get_user(), 
                                            error = function(err) str(err)))
}

shinyApp(ui, server)