2014-08-28 26 views
0

我有以下形式的server.R文件:從反應函數調用變量裏面渲染*()

server.R

shinyServer(


    function(input, output, session) {  

    mydata<- reactive({ 
       df<- dataframe1 
       variable1 
       variable2 
       list(df, variable1, variable2) 

    }) 

    output$plot<- renderPlot({ 

    p<-ggplot(mydata()$df, aes(y=V8, x = 1:nrow(mydata()$df), fill = V8)) 
    print(p) 

    }) 
}) 

我的問題是,調用ggplot,而它似乎識別mydata $ df(),它返回錯誤

錯誤在nrow(mydata()$ df):找不到函數「mydata」

我不確定我的語法錯在哪裏。任何人都可以點亮一下嗎?謝謝!

+0

在上面的代碼中,mydata <-reactive {('''''和'('需要切換位置。是否在您的實際代碼中? – 2014-08-28 18:31:39

+0

抱歉,是的,在我的實際代碼中是正確的。 – yahooligan8 2014-08-28 18:32:31

+0

我認爲這可能與aes()中ggplot2的環境有關,但是我在提出的[這裏]中提出了修復_environment = environment()_(http://stackoverflow.com/questions/) 19531729/r-shiny-fill-value-not-pass-to-ggplot-incorrect-in-shiny-server-error-obje)並且它仍然沒有幫助 – yahooligan8 2014-08-28 18:33:32

回答

1

據我所知,被動閃亮的物體在清單上播放不好。因爲看起來你並沒有使用'variable1'和'variable2'只是忽略它們,只是做了dataframe(我假設它已經被全局訪問並且不被導入?)。它也可以簡單地在ggplot調用之前調用反應器,但如果不使用這些額外的變量,我會錯誤地選擇簡單。一個很簡單的例子:

runApp(
    list(ui = basicPage(
    h1('Demo Shiny'), 
    plotOutput("plot") 
) 

    ,server = function(input, output) { 
    mydata <- reactive({ 
     dataframe1 <- data.frame(cond = rep(c("A", "B"), each=10), 
           xvar = 1:20 + rnorm(20,sd=3), 
           yvar = 1:20 + rnorm(20,sd=3)) 
     dataframe1 
    }) 

    output$plot = renderPlot({ 
     df <- mydata() 
     p<-ggplot(df, aes(x=xvar, y = yvar)) + geom_point() 
     print(p) 
    }) 
    }) 
) 
+1

(+1)。我不知道你可以這樣調用runApp。Cool。 – MrFlick 2014-08-28 18:54:04

+0

@MrFlick對於小應用程序來說很方便,但我仍然普遍喜歡特別是當應用程序變大時,保持兩個文件分開。 – cdeterman 2014-08-28 18:56:08

+0

我完全同意。我主要是在回答StackOverflow問題的背景下考慮它;) – MrFlick 2014-08-28 18:57:31

0

我要shamless喧賓奪主的@charles代碼,但我認爲在這種情況下,問題實際上是你aes()。這似乎是工作

runApp(
    list(ui = basicPage(
    h1('Demo Shiny'), 
    plotOutput("plot") 
) 

    ,server = function(input, output) { 
    mydata <- reactive({ 
      df <- data.frame(V8=sample(1:4, 20, replace=T)) 
      list(df=df, variable1=1, variable2=2) 
    }) 

    output$plot = renderPlot({ 
     p<-ggplot(mydata()$df, aes(x=seq_along(V8), y = V8)) + geom_point() 
     print(p) 
    }) 
    }) 
) 

的問題指的是變量在AES是不是在你的data.frame,你傳遞給GGPLOT2。在這裏通過確保從df包含適當的變量,我們似乎沒有問題。

+0

我不認爲這是問題,因爲當我定義數據框INSIDE renderPlot()時,對ggplot2的原始調用工作正常,只要我放入'environment = environment()'換句話說,在這種情況下,調用'p <-ggplot(df(),aes(y = V8,x = 1:nrow(df()),fill = V8),environment = environment())+ geom_histogram()'。 – yahooligan8 2014-08-28 19:12:39

+0

請注意,V8是df的一個列,因此ggplot應該可以識別該列。 – yahooligan8 2014-08-28 19:17:55

+0

我的觀點是導致錯誤的代碼是'aes()'(特別是'x =')中的代碼,而不是'ggplot'的第一個參數中的代碼。默認情況下,'aes'參數是在數據參數的上下文中進行評估的。如果沒有在那裏找到,通常你會走上定義環境來解析符號。但是,通過渲染繪圖的方式,似乎改變了「正常」的環境鏈。因此添加一個明確的環境會有所幫助,但通常它可能是一個更好的想法,可以在data.frame中包含所有想要繪製的變量 – MrFlick 2014-08-28 21:17:11