闪亮的服务器为函数

时间:2016-03-15 15:40:00

标签: r shiny shiny-server

我是闪亮的(以及任何网络应用程序的东西)的新手,但是相当精通R。我正在尝试构建一个相当基本的页面,它在加载页面之前运行API调用,根据响应获取一些输入,然后运行另一个API调用并进行一些分析。我输入有问题。

这是我的用户界面:

shinyUI(fluidPage(

  # Application title
  titlePanel("IGP Risk Analysis"),

  sidebarLayout(
    sidebarPanel(
      selectInput("portfolio", "Underlying Portfolio:", 
                  choices = portfolioList),  
      selectInput("portDate", "Portfolio Date:",
                  choices = "Pick a portfolio..."),
      width = 2),

    mainPanel(
      tabsetPanel(type = "tabs", 
                  tabPanel("Plot", plotOutput("plot")), 
                  tabPanel("Summary", verbatimTextOutput("summary")), 
                  tabPanel("Table", tableOutput("table"))
      )
    )
  )
))

我的服务器代码如下:

shinyServer(function(input, output, session) {

    portfolioInput <- reactive({
      temp <- setnames(sendRequest(theURL, myUN, myPW, action = "GetPortfolios"), "Available Portfolios")
      portfolioList <- temp[!grepl("AAA|ZZZ",unlist(temp)),]
      return(portfolioList)
    })

  observe({
    portfolioDates <- setnames(sendRequest(theURL, myUN, myPW, action = "GetPortfolioDates", 
                                           portfolioName = input$portfolio, portfolioCurrency = "USD"),
                               "Available Dates")
    updateSelectInput(session, "portDate",
                    choices = c("Pick One", portfolioDates),
                    selected = "Pick One")
  })
})

它正常工作,没有错误或警告,但第一个输入框显示sendRequest()的结果。它不是设置名称,也不是对响应进行子集化。即 - 在我得到的第一个selectInput框中:

theResponse.ArrayOfString.string
AAA - IGP\\Diver\\20151007
AAA - IGP\\Diver\\TEST
REAL
BD
Bvdh
Cap
Cas
Diver
IGP Aggregate
ZZZ - Archive
ZZZ - Archive\\AAA - IGP

我想要的地方:

Available Portfolios
REAL
BD
Bvdh
Cap
Cas
Diver
IGP Aggregate

这对我来说毫无意义,因为它似乎忽略了代码。

由于portfolioList是静态的,因此只需要在第一次加载页面时加载一次,我尝试将列表放在服务器函数之外。我想这会设置一个我可以在UI中引用的全局变量。这没用。有什么想法为什么这种方法不起作用?

这与“会话”有什么关系吗?在服务器功能?我有旧会话运行吗?是&#39;会话&#39; R会话?当我在RStudio中重新启动应用程序时它会重新启动吗?

2 个答案:

答案 0 :(得分:2)

为了给你一些开始,即renderUI的最小例子:

    shinyApp(

  ui = sidebarLayout(
    sidebarPanel(
      uiOutput("portfolio"),  
      selectInput("portDate", "Portfolio Date:",
                  choices = "Pick a portfolio..."),
      width = 2),
    mainPanel()),


  server = function(input, output) {

    ui1 <- reactive({

      temp <- c("AAA","1","2","3","ZZZ")
      temp[!grepl("AAA|ZZZ",temp)]

    })

    output$portfolio <- renderUI ({

      selectInput("portfolio", "Underlying Portfolio:", 
                  choices = ui1())

    })

  }
)

要添加我的注释,你不能简单地在ui.r中调用函数或对象,在server.r中渲染对象并调用那些在ui.r中标记为output $ name的对象。 我建议你做一些闪亮的教程http://shiny.rstudio.com/tutorial/

答案 1 :(得分:0)

谢谢大家!我弄清楚了,或者我找到了问题的解决方案。非常感谢Sebastion指引我朝着正确的方向前进。 (还要感谢this post。)我只发了一个答案,对此有所了解。所有支持Sebastion和其他人的道具。

这是工作ui:

shinyUI(fluidPage(

  # Application title
  titlePanel("IGP Risk Analysis"),

  sidebarLayout(
    sidebarPanel(
      uiOutput("portfolio"),  
      uiOutput("portDate"),
      width = 2),

    mainPanel(
      tabsetPanel(type = "tabs", 
                  tabPanel("Plot", plotOutput("plot")), 
                  tabPanel("Summary", verbatimTextOutput("summary")), 
                  tabPanel("Table", tableOutput("table"))
      )
    )
  )
))

这是服务器:

shinyServer(function(input, output, session) {

  output$portfolio <- renderUI ({
    temp <- setNames(sendRequest(theURL, myUN, myPW, action = "GetPortfolios"), "Available Portfolios")
    temp <- temp[sapply(temp, function (x) !grepl("AAA|ZZZ",x)),]
    selectInput("portfolio", "Underlying Portfolio:", choices = c("Pick One",temp))
  })

  output$portDate <- renderUI ({
    if (is.null(input$portfolio) || input$portfolio == "Pick One") return() else { 
           portfolioDates <- setNames(sendRequest(theURL, myUN, myPW, action = "GetPortfolioDates", 
                                                  portfolioName = input$portfolio, portfolioCurrency = "USD"),
                                      "Available Dates")
           selectInput("portDate", "Portfolio Date",
                             choices = c("Pick One", portfolioDates),
                             selected = "Pick One")
    }

  })
})