2016-03-15 129 views
2

我是新的閃亮(和任何Web應用程序的東西),但相當熟悉R.我試圖建立一個相當基本的頁面,在加載頁面之前運行一個API調用,根據響應獲取一些輸入,然後運行另一個API調用並進行一些分析。我在輸入時遇到問題。閃亮的服務器返回功能錯誤值

這裏是我的UI:

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是靜態的,在第一次加載頁面時只需要加載一次,所以我嘗試在服務器功能之外獲取列表。我想這會設置一個全局變量,然後我可以在用戶界面中引用。這沒有奏效。任何想法爲什麼這種方法不工作?

這是否與服務器功能中的「會話」有關?我有舊的會議運行嗎? '會議'是R會議嗎?當我在RStudio中重新啓動應用程序時它會重新啓動嗎?

+0

您需要返回您portfolioList對象的反應功能。此外,我會建議使用renderUI動態用戶界面部分。 – Sebastian

+0

感謝您的時間。我已經嘗試過,並沒有改變任何東西。此外,我嘗試使用renderUI,我無法讓它工作。 – lukehawk

+0

這是您正在運行的確切代碼嗎?認爲這是一個草圖,你的閃亮環境應該完全不知道portfolioList,嘗試在ui.r中調用portfolioInput() - 但我不確定這會在你的ui.r中工作。我試圖一起拿東西.. – Sebastian

回答

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,你渲染服務器的對象.r並調用這些對象,在ui.r中標記爲輸出$ name。 我會建議你做閃亮的教程http://shiny.rstudio.com/tutorial/

+0

這是我以前嘗試使用renderUI時遇到的問題。運行你的代碼,我不斷收到ERROR:[on_request_read]連接被peer重置。 (我使用chrome作爲瀏覽器,所以它應該可以工作。)對不起,我實際上正在運行你的代碼,並在服務器中使用我的observe()函數。 – lukehawk

+0

嗯,這很奇怪,如果你將這段代碼複製到你的控制檯,它是否工作? – Sebastian

+0

我如何獲得輸出$組合selectInput的選擇返回到portDate selectInput? – lukehawk

0

謝謝大家!我想通了,或者我找出瞭解決問題的辦法。非常感謝Sebastion將我引向正確的方向。 (也感謝this post。)我只發佈了一個答案,在這種情況下投下了一個結論。所有道具給Sebastion和其他人。

這裏是工作界面:

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") 
    } 

    }) 
})