首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >If语句将该条件视为FALSE,尽管该条件打印为TRUE

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

Stack Overflow用户
提问于 2020-06-11 08:11:06
回答 1查看 93关注 0票数 0

我正在创建一个闪亮的应用程序,这将显示模式,只有当用户第一次访问该应用程序。第一次之后,将不会显示modal。然而,这并不起作用,并且在每次访问中都会显示模式。

首先,我将会话ID设置为cookie,然后尝试将modal放入if语句中,这样,如果会话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。

下面是一个可重现的例子,展示了我正在经历的事情。提前谢谢你。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-03 08:14:48

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

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62315095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档