2017-01-17 5 views
0

前提条件: Shiny AppがUI出力を含むモジュールを使用しています。 UI出力自体には任意の入力が含まれます(例:textInput)。 (入力UIOutputのとの)すべてのIDがns()反応入力ベクトルが奇妙に光沢のあるモジュールで引用符を使用しています

観察を使用して生成されます。inputベクターは、内部の引用で保存されます。それは問題ありませんが、私はjavascript(conditionalInput(condition='input.myModule-myInputtest=="someText"'))の入力を使用できません。 input$'mymodule'input$myModuleと呼ばれていますが、どうすればいいですか?それはバグですか、何か間違っていますか?

事前に感謝し、よろしく

app screenshot

最小例:自分の質問に答えるための

library(shiny) 

ui <- fixedPage(
    h2("Module example"), myModuleUI("myModule"), verbatimTextOutput("summary") 
) 
server <- function(input, output, session) { 
    callModule(myModule, "myModule", stringsAsFactors=F) 
    output$summary <- renderPrint({ reactiveValuesToList(input) }) 
} 
shinyApp(ui, server) 

myModuleUI <- function(id) { 
    ns <- NS(id) 
    uiOutput(ns("myInput")) 
} 
myModule <- function(input, output, session, stringsAsFactors) { 
    output$myInput <- renderUI({ textInput(ns("myInputtest"), "A Text Input") }) 
} 
+0

コメント:IDを使用している場合、これはおそらく、常にそうです「 - 」。 uiOutputを 'textInput(" myModule-myInput "、" A Text Input ")として変更すると、問題は解決されません。だからこれは輝くことによって意図されていますか?回避策はありますか? – shosaco

+0

これはR機能です。すべてのRコードと同様に、非標準の引数や変数名(例えばダッシュを含むもの)を使用する必要がある場合は、そのまわりでバッククッキーを使用する必要があります。 –

答えて

0

申し訳ありませんが、私は、これは他の人が遭遇するものだと思います。

光沢のあるモジュールがない状況で使用できるドット表記の代わりに、input['myModule-myInputtest']を使用してjavascriptの入力を使用することができます(つまり、条件付き条件)。

0

あなたは次の操作を行う必要があります。

* myModuleUI内で使用タグリスト()

*注

のmymodule

内NS()を使用しないでください(

NS) callModule()から渡された文字列をidに連結します。例えばNS( "myInputtest")は "MyModuleという-myInputtest" を与える

library(shiny) 

## Module UI ---- 
myModuleUI <- function(id) { 
    ns <- NS(id) 
    # taglist should be added here 
    tagList(
    uiOutput(ns("myInput")) 
) 
} 

## Module Server ---- 
myModule <- function(input, output, session, stringsAsFactors) { 
    output$myInput <- renderUI({ 
    textInput("myInputtest", 
       "A Text Input") 
    }) 
} 

## UI ---- 
ui <- fixedPage(
    h2("Module example"), 
    myModuleUI("myModule"), 
    verbatimTextOutput("summary") 
) 

## Server ---- 
server <- function(input, output, session) { 
    callModule(myModule, "myModule", stringsAsFactors=F) 
    output$summary <- renderPrint({reactiveValuesToList(input)}) 
} 

# Run the application --------------------------------------------------------- 
shinyApp(ui = ui, server = server) 

enter image description here

+1

しかし、入力IDはモジュール化されている必要があります。つまり、myModuleの名前空間でなければなりません。そうでなければ、アプリケーションのalleIDを追跡して、 "myInputtest"と呼ばれないようにする必要があります。ここでの解決策は、単にns()の代わりに 'session $ ns(" myInputtest ")'を呼び出すことです。 1つ以上のタグが与えられたときだけ、 'tagList'の使用は機能性のためには必要ありません。私は引用符を意図していると思うが、私の回避策は、リストセレクタ( 'input ['myModule-myInputtest']')をjavascriptとconditionalPanelで使うことでした。 – shosaco

0

は、あなたは非常に興味深いエッジケースを発見しました。幸運にも、あなたがすでに発見したように、inputの子供たちにアクセスする別の方法があります(点の代わりに角かっこを使います)。 futreで、この時につまずくことが誰のために、ここでの条件付きパネルを含め、最小限の作業例です:

library(shiny) 

myModuleUI <- function(id) { 
    ns <- NS(id) 
    tagList(
    uiOutput(ns("myInput")), 
    conditionalPanel(
     condition = "input['myModule-myInputtest'] === 'hello'", 
     # condition = "console.log(input['myModule-myInputtest'])", # useful for debugging 
     sliderInput(ns("breakCount"), "Break Count", min=1, max=1000, value=10) 
    ) 
) 
} 
myModule <- function(input, output, session, stringsAsFactors) { 
    output$myInput <- renderUI({ 
    textInput(session$ns("myInputtest"), "A Text Input") 
    }) 
} 

ui <- fixedPage(
    h2("Module example"), 
    myModuleUI("myModule"), 
    verbatimTextOutput("summary") 
) 

server <- function(input, output, session) { 
    callModule(myModule, "myModule", stringsAsFactors=F) 
    output$summary <- renderPrint({ reactiveValuesToList(input) }) 
} 

shinyApp(ui, server) 
関連する問題