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

时间:2015-08-24 10:26:23

标签: r shiny-server shiny

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

我的父应用程序必须调用这个闪亮的应用程序。我想确保单独从这个父应用程序调用我的闪亮应用程序。即不应使用其URL直接调用它。

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

因此,作为第一步,我尝试检查是否停止/阻止闪亮的app,如果参数不存在。

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

我尝试使用validation

进行屏蔽

这是我的服务器.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 ,将显示“请提供参数'foo'”。但还有其他细节。我只想显示一个只有这个警告的页面。我怎么能这样做?

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

1 个答案:

答案 0 :(得分:3)

您可以尝试使用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")
  )     
)