2017-10-18 8 views
1

は、輝くプログラミングについて学生に教えるときにこの奇妙な問題に遭遇しました。私が望んでdelete verbatimtextOutput

がverbatimtextOuput要素を削除するコードを作るのではなく、空の値

を印刷することでしたこれは、彼が書いたコードですが、それは基本的にすべてのボタン、全体のUIを削除します。これはできますか?私は条件付きパネルなどのより複雑なオプションを知っていますが、removeUIが私がここで期待したことをしない理由を理解しようとしています。

ありがとうございます!

アプリ:

library(shiny) 

ui<-fluidPage( h5("Hello there"),  #First text on the window 
       br(),       #empty line 
       actionButton(inputId = "ClickonMe", label = "Make data"), # button 1 
       actionButton(inputId = "ClickonMe2", label = "Print data"), # button 2 
       actionButton(inputId = "ClickonMe3", label = "Transform data"), 

       verbatimTextOutput("Response_text") #reactive text output ) 

server <- function(input,output) { 
    values <- reactiveValues() 
    observeEvent(input$ClickonMe, 
       values$name <- TRUE ) 
    observeEvent(input$ClickonMe3, 
       if (values$name == TRUE) { values$name <- FALSE} 
       else { values$name <- TRUE} ) 
    observeEvent(input$ClickonMe2, 
       if (values$name == TRUE) { output$Response_text <- renderPrint(isolate({values$name})) } 
       else if (values$name == FALSE) { removeUI(
       selector = "div:has(> #Response_text)" 
       ) 
       } 

) } 

shinyApp(ui, server) 

EDITバージョン:このバージョンは削除され、UIの逐語的な要素をリメイクするよう

変更ポークチョップは少しに答えます。 私が今完全に理解しようとしているのは、作品req(....)がそのような影響を持つ理由です。 print(values $ name)は変数が存在することを証明し、観察者はそれを見ていますが、req()行があれば、アプリケーションは突然、最初に削除された後にverbatimtextputを再作成しません。 私はなぜこれが当てはまるのか学ぶことができます。ありがとうございました!

library(shiny) 

ui <- fluidPage( 
    h5("Hello there"),           # First text on the window 
    br(),              # empty line 
    actionButton(inputId = "ClickonMe", label = "Make data"), # button 1 
    actionButton(inputId = "ClickonMe2", label = "Print data"), # button 2 
    actionButton(inputId = "ClickonMe3", label = "Transform data"), 
    mainPanel(verbatimTextOutput("Response_text")) 
) 

server <- function(input,output,session) { 
    values <- reactiveValues() 
    values$name <- T 

    observeEvent(input$ClickonMe,{ 
    values$name <- T 
    }) 

    observeEvent(input$ClickonMe3,{ 
    if (values$name){ values$name <- F} 
    else{ values$name <- T } 
    }) 

    observeEvent(input$ClickonMe2,{ 

    print(values$name) 
    output$Response_text <- renderPrint({ isolate({ 

    req(values$name) 
    if(!values$name){ 
     removeUI(
     selector = "div:has(> #Response_text)" 
    ) 
    }else { 
    as.character(values$name)} 
    }) 
     }) 

}) 
} 
+0

私は、あなたにもissuの負荷があるので、何か教えが必要だと思いますあなたのコードで! –

+0

答え、第二回ありがとう、第二回私は完璧から遠いことを知っていますが、それでも自分自身を学び、そのすべてを掌握しているので、ときどき奇妙な方法でコードします。これは単純な間違いだった、私のバージョンは括弧を持っていた、私の学生のバージョンはなかった。正直言って、私は彼のコードに中括弧がないことに気づいていませんでした。本当にそれらは必要です。私はいつもそれらを使用します。 – Mark

+0

@Ben、リンクありがとう。私はそれを教えと呼ぶ限りは行かないだろう。私はまだ自分で学習者が多すぎますが、ビルドしているプログラムで私のコードがどのように働いているのかを私の同僚に示す必要があります – Mark

答えて

2

1)まず第一に、コードを書くときGoogle's R Style Guideを見ているし、それに固執してみてください私は、両方のは、あなたとあなたの学生はそれの恩恵を受けると思います。

2)などobserveEventrenderPrint

3などの機能を使用するときにUIを削除する方法は非常に便利な

サンプルコードであるreq機能をよく理解してください)すぎ、中括弧を使用します。

library(shiny) 

ui <- fluidPage( 
    h5("Hello there"),           # First text on the window 
    br(),              # empty line 
    actionButton(inputId = "ClickonMe", label = "Make data"), # button 1 
    actionButton(inputId = "ClickonMe2", label = "Print data"), # button 2 
    actionButton(inputId = "ClickonMe3", label = "Transform data"), 
    mainPanel(verbatimTextOutput("Response_text")) 
) 

server <- function(input,output,session) { 
    values <- reactiveValues() 
    values$name <- NULL 

    observeEvent(input$ClickonMe,{ 
    values$name <- T 
    }) 

    observeEvent(input$ClickonMe3,{ 
    if (values$name){ 
     values$name <- F} 
    else{ 
     values$name <- T 
    } 
    }) 

    observeEvent(input$ClickonMe2,{ 
    if (values$name){ 
     values$name <- F 
     } 
    else{ 
     values$name <- T 
    } 
    }) 

    output$Response_text <- renderPrint({ 
    req(values$name) 
    if(!values$name){ 
     removeUI(
     selector = "div:has(> #Response_text)" 
    ) 
    } 
    as.character(values$name)}) 
} 

shinyApp(ui, server) 

enter image description here

+0

'' 'req''に感謝します。 '' 'stopifnot()' 'に似ていますか? – amrrs

+0

'stopifnot'は与えられたそれぞれの式を評価し、すべてが真であることを確認してshinyappを停止するかもしれません。 'req'は' try-error "クラスです。エラーをキャッチする必要があります –

+0

私は間違いなくスタイルルールを勉強します。私はコーディングに関しては自立していて、今でも正しい方法で行うことを学んでいます あなたの答えはclickonme2とclickonme3のobserveEventのコードと同じですが、それを実行するように変更しました 私は知っています$ nameはサーバが作成されるとすぐに存在します(特に、$ name < - TはNULLではなく値としてコード化されています)まだアプリはそれなしで動作しません。あなたはそれがなぜポークチョップなのか説明できますか?(質問の編集で新しいアプリを見てください – Mark