If 语句将条件视为 FALSE,尽管条件打印为 TRUE

If statement treats the condition as FALSE although the condition prints out as TRUE

我正在创建一个闪亮的应用程序,它只会在用户第一次访问该应用程序时显示模态。第一次之后,模态将不会显示。但是,这不起作用,每次访问都会显示模态。

首先我设置了一个session ID作为cookie,然后尝试将modal放在if语句中,这样如果session ID存在并且等于我设置的,它就不会被执行。虽然if条件里的语句是FALSE,但是模态还是显示出来了。此外,如果我手动在 if 条件下写入 FALSE,它会起作用并且不会显示模态。我使用 textOutput 来显示条件是 TRUE 还是 FALSE,它显示了与 if 语句的行为相反的情况。

我也试过只设置 input$jscookie != sessionid 作为条件,但是它给出了 Error in if: argument is of length zero 错误,尽管当我在 textOutput({input$jscookie != sessionid}) 中使用相同的语句时它打印 FALSE

下面是一个可重现的示例,展示了我所遇到的情况。提前谢谢你。

library(shiny)
library(shinyjs)

if (!dir.exists('www/')) {
  dir.create('www')
}

download.file(
  url = 'https://github.com/js-cookie/js-cookie/releases/download/v2.2.1/js.cookie-2.2.1.min.js',
  destfile = 'www/js.cookie.js'
)

sessionid <- "OQGYIrpOvV3KnOpBSPgOhqGxz2dE5A9IpKhP6Dy2kd7xIQhLjwYzskn9mIhRAVHo29" 

addResourcePath("js", "www")

jsCode <- '
  shinyjs.getcookie = function(params) {
    var cookie = Cookies.get("id");
    if (typeof cookie !== "undefined") {
      Shiny.onInputChange("jscookie", cookie);
    } else {
      var cookie = "";
      Shiny.onInputChange("jscookie", cookie);
    }
  }
  shinyjs.setcookie = function(params) {
    Cookies.set("id", escape(params), { expires: 0.5 });  
    Shiny.onInputChange("jscookie", params);
  }
  shinyjs.rmcookie = function(params) {
    Cookies.remove("id");
    Shiny.onInputChange("jscookie", "");
  }
'

ui <- fluidPage(
  tags$head(
    tags$script(src = "js/js.cookie.js")
  ),
  useShinyjs(),
  extendShinyjs(text = jsCode),
  textOutput('id'),
  verbatimTextOutput('sometext')
)

server <- function(input, output) {


  observeEvent("", {
    js$getcookie()
    if (is.null(input$jscookie) || input$jscookie != sessionid) {

      showModal(modalDialog(
        "Click close button",
        easyClose = TRUE,
        footer = tagList(
          actionButton(inputId = "close", label = "Close", icon = icon("close"))
        )
      ))
    }
  })

  observeEvent(input$close,{
    removeModal()
    js$setcookie(sessionid)
  })

  sometext<-reactive({

    is.null(input$jscookie) || input$jscookie != sessionid
  })

  output$id<-renderText({
    paste('session ID:', input$jscookie)
  })

  output$sometext<-renderText({
    sometext()
  })
}

shinyApp(ui = ui, server = server)

好的,我已经解决了。 使用 input$jscookie 作为 observeEvent 中的语句并将 js$getcookie() 放在 observeEvent 之外解决了问题。

library(shiny)
library(shinyjs)

if (!dir.exists('www/')) {
  dir.create('www')
}

download.file(
  url = 'https://github.com/js-cookie/js-cookie/releases/download/v2.2.1/js.cookie-2.2.1.min.js',
  destfile = 'www/js.cookie.js'
)

sessionid <- "OQGYIrpOvV3KnOpBSPgOhqGxz2dE5A9IpKhP6Dy2kd7xIQhLjwYzskn9mIhRAVHo291" 

addResourcePath("js", "www")

jsCode <- '
  shinyjs.getcookie = function(params) {
    var cookie = Cookies.get("id");
    if (typeof cookie !== "undefined") {
      Shiny.onInputChange("jscookie", cookie);
    } else {
      var cookie = "";
      Shiny.onInputChange("jscookie", cookie);
    }
  }
  shinyjs.setcookie = function(params) {
    Cookies.set("id", escape(params), { expires: 0.5 });  
    Shiny.onInputChange("jscookie", params);
  }
  shinyjs.rmcookie = function(params) {
    Cookies.remove("id");
    Shiny.onInputChange("jscookie", "");
  }
'

ui <- fluidPage(
  tags$head(
    tags$script(src = "js/js.cookie.js")
  ),
  useShinyjs(),
  extendShinyjs(text = jsCode),
  textOutput('id'),
  verbatimTextOutput('sometext')
)

server <- function(input, output) {
  
  js$getcookie()
  observeEvent(input$jscookie, {
    
    if (is.null(input$jscookie) || input$jscookie != sessionid) {
      
      showModal(modalDialog(
        "Click close button",
        easyClose = TRUE,
        footer = tagList(
          actionButton(inputId = "close", label = "Close", icon = icon("close"))
        )
      ))
    }
  })
  
  observeEvent(input$close,{
    removeModal()
    js$setcookie(sessionid)
  })
  
  sometext<-reactive({
    
    is.null(input$jscookie) || input$jscookie != sessionid
  })
  
  output$id<-renderText({
    paste('session ID:', input$jscookie)
  })
  
  output$sometext<-renderText({
    sometext()
  })
}

shinyApp(ui = ui, server = server)