2016-08-26 41 views
0

我試圖在server.R中調用一個函數,並將返回的列表保存到全局環境中,該函數被一個操作按鈕調用。然後,我將使用該列表來運行另一個由另一個按鈕根據列表觸發的函數,以繪製圖表。這裏有一個簡單的示例代碼:調用函數並將返回列表保存爲Shiny

shinyServer(function(input, output) { 

    v <- reactiveValues() 

    observeEvent(input$button1, { 
    v$button1 = TRUE 
    }) 

    savedlist <<- reactive({ 
    if (v$button1){ 
     return(savedlist <- f1(10) 
    } 
    }) 

output$plot <- renderPlot({ 
    f2(savedlist) 
}) 

}) 

其中

f1 <- function(x){ 
    savedlist = list(xdata = 1:x, ydata = x:1) 
    names(savedlist) = c("xdata", "ydata") 
    return(savedlist) 
} 

f2 <- function(x){ 
    attach(savedlist) 
    plot(xdata, ydata) 
} 

,但我無法得到它的工作...

感謝。

+0

嘗試'觀察({如果(V $按鈕1){ savedlist << - F1(10) }})' – Batanichek

+0

謝謝你的答覆。它給了我錯誤: '警告:錯誤在if:參數的長度爲零' –

+0

嘗試添加默認值'v < - reactiveValues(button1 = FALSE)' – Batanichek

回答

1

試試這個

library(shiny) 
ui=shinyUI(fluidPage(

    actionButton("button1","button1"), 
    plotOutput("plot") 

)) 
f1 <- function(x){ 
    savedlist = list(xdata = 1:x, ydata = x:1) 
    names(savedlist) = c("xdata", "ydata") 
    return(savedlist) 
} 
f2 <- function(x){ # change a bit to use x as argument 
    plot(x$xdata, x$ydata) 
} 

server=shinyServer(function(input, output) { 

    v <- reactiveValues(button1=FALSE) 

    observeEvent(input$button1, { 
    v$button1 = TRUE 
    }) 

    observe({ 
    if (v$button1){ 
     savedlist <<- f1(10) 
    } 
    }) 

     output$plot <- renderPlot({ 
     if(v$button1){# plot only after button because before list dont exist 
     f2(savedlist) 
     } 
     }) 

}) 

shinyApp(ui,server) 
+1

非常感謝!它現在有效。你是個天才。 –