2017-10-10 9 views
0

のように、レンダリングのレンダリングにdo.callを使用したいと思います。コードの下には動作しません:シャイニー:レンダリングファミリーファンクションを実行するためにdo.callを使用する

rm(list=ls()) 

library(shiny) 

ui <- fluidPage(

    selectInput("select", label = h3("Select box"), 
       choices = list("Choice 1" = 1, "Choice 2" = 2, "Choice 3" = 3), 
       selected = 1), 
    hr(), 
    fluidRow(column(3, verbatimTextOutput("value"))) 

) 

server <- function(input, output, session) { 

    output$value <- do.call("renderPrint", list({ input$select })) 
} 

shinyApp(ui, server) 

エラー:

Warning: Error in .getReactiveEnvironment()$currentContext: Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.) 
Stack trace (innermost first): 
    45: .getReactiveEnvironment()$currentContext 
    44: .subset2(x, "impl")$get 
    43: $.reactivevalues 
[...] 

をこれを達成するためにどのように?私はこれが何らかの形で環境と怠惰な評価と結びついていると推測しているので、閉鎖は解決策かもしれませんが、これはただの推測です...

+0

私は 'observe({output $ value < - do.call(" renderPrint "、list({input $ select})}})が問題を解決すると思われます。 – Benjamin

答えて

0

SOからのthis answerに基づいてこれを達成する方法が見つかりました。重要な部分はlistの代わりにalistを使用しています。ドキュメントから:

alist handles its arguments as if they described function arguments. So the values are not evaluated, and tagged arguments with no value are allowed whereas list simply ignores them. alist is most often used in conjunction with formals.

rm(list=ls()) 

library(shiny) 

ui <- fluidPage( 
    selectInput("select", label = h3("Select box"), 
       choices = list("Choice 1" = 1, "Choice 2" = 2, "Choice 3" = 3), 
       selected = 1), 
    hr(), 
    fluidRow(column(3, verbatimTextOutput("value")))  
) 

server <- function(input, output, session) {   
    output$value <- do.call(
    renderPrint, 
    alist(input$select) 
) 
} 

shinyApp(ui, server) 

はまた、あなたはおそらくrenderPrintquoted引数を使用して、あなたの表現の周りquoteを包むが、私はそのアプローチとは運がなかったことができます。

0

注:グレゴールのコメントにコメントを追加しようとしていましたが、失敗しました。

do.callは、コールを構築するときにデフォルトでその引数を評価します。

しかし、あなたは未評価の引数を残してquote = TRUEを指定することができます。

output$value <- do.call(renderPrint, list(quote(input$select), quoted = TRUE), quote = TRUE) 

しかし、シンプルなだけ呼び出しで引用された引数を使用することです:

output$value <- do.call(renderPrint, list(quote(input$select))) 

次に引用された表現が取得しますコール時に評価され、反応的なコンテキスト外のinput$selectは評価されません。

+0

'alist'はトリックを行い、' quote'より簡単な変更ですが、answerはthxです。 – RSzT

+0

非常に興味深い。私は実際に 'quote'でかなり遊んでいて、それを動作させることができませんでした。それがとても簡単であることを見て私は少しばかに落ちた:) –

関連する問題