如果未传入参数,如何阻止闪亮的应用程序 URL

How to block shiny app if a parameter is not passed in URL

我想写一个闪亮的应用程序。这个闪亮的应用程序将用于来自其他应用程序(父应用程序)的分析。

我的父应用程序必须调用这个闪亮的应用程序。我想确保我的闪亮应用程序是从这个父应用程序单独调用的。也就是说,不应使用其 URL.

直接调用它

为此,我正在考虑将密钥与闪亮的 URL 一起传递。在闪亮的应用程序中,我需要进行一个 REST 调用来验证密钥。如果此密钥来自我的父应用程序,则该密钥将有效。如果密钥无效,我需要阻止我闪亮的应用程序的执行。

因此,作为第一步,如果参数不存在,我尝试检查 stopping/blocking 闪亮的应用程序。

我可以使用 session$clientData 读取 http 查询参数。

我尝试使用 validation

进行阻止

这是我的 server.R

shinyServer(function(input, output, session) {

  output$data <- reactive({
    query <- parseQueryString(session$clientData$url_search)
    validate(
      need(exists("query$foo"), "Please provide parameter 'foo'")
    )
    query
  })

  # Return the components of the URL in a string:
  output$urlText <- renderText({
    paste(sep = "",
      "protocol: ", session$clientData$url_protocol, "\n",
      "hostname: ", session$clientData$url_hostname, "\n",
      "pathname: ", session$clientData$url_pathname, "\n",
      "port: ",     session$clientData$url_port,     "\n",
      "search: ",   session$clientData$url_search,   "\n"
    )
  })

})

这是我的 ui.R

shinyUI(bootstrapPage(
  h3("URL components"),
  verbatimTextOutput("urlText"),

  h3("Parsed query string"),
  verbatimTextOutput("data")
))

从代码中可以看出,如果不传递查询参数foo,就会显示"Please provide parameter 'foo'"。但连同其他细节。我只想显示带有此警告的页面。我该怎么做?

由于我是 R 和闪亮应用程序的新手,我不确定我的方法是否正确?

您可以尝试使用 renderUIuiOutput 仅在传递查询参数时显示应用程序的其余部分。

这是一个例子:

server.R

shinyServer(function(input, output, session) {          

  output$shiny_app <- renderUI({
    #check if foo was passed, if it is add the UI elements
    query <- parseQueryString(session$clientData$url_search)
    validate(need(!is.null(query$foo), "Please provide parameter 'foo'"))
    plotOutput("plot")
  })

  #this output will only show if the plotOutput is passed by the previous function
  output$plot <- renderPlot({
    x <- rnorm(10)
    y <- rnorm(10)
    plot(x, y)
  })
})

ui.R

shinyUI(bootstrapPage(        
  uiOutput("shiny_app")
  )     
)