如果验证功能未验证,则返回默认值

时间:2019-09-04 12:57:50

标签: r shiny shiny-reactivity

我正在使用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反应函数来获取默认语言。

因此,如果用户已注册(因此我的googlesheet数据库中存在用户ID),则语言必须来自此表。但是,如果用户已通过身份验证但未注册(db中不存在用户ID),则语言必须为英语。 因此,这两种情况在ReactiveLocale中对我有用 但是第三种情况-用户不进行身份验证对我不起作用。 所以我在这部分代码中遇到的问题:

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

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

1 个答案:

答案 0 :(得分:0)

您的代码无法正常工作的原因是,User()虚假时,UserInfo()(无提示)引发了错误。那就是它返回一个错误(不是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)