2017-01-17 7 views
0

Пререквизиты: Блестящее приложение с использованием модуля, содержащего выход пользовательского интерфейса. Сам вывод пользовательского интерфейса содержит любой вход (например, textInput). Все идентификаторы (от UIOutput и Ввода) генерируются с использованием ns()Реактивный входной вектор странно использует кавычки в блестящих модулях

замечания: мой input Вектор сохраняется внутри с цитатами. Это не проблема, но не позволяет мне использовать вход в javascript (в conditionalInput(condition='input.myModule-myInputtest=="someText"')). Как я могу добиться того, что input$'mymodule' называется input$myModule? Это ошибка, или я делаю что-то неправильно?

Спасибо заранее и наилучшими пожеланиями

app screenshot

Minimal Например:

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

комментарий: это, наверное, всегда бывает, когда идентификатор используется «-». Когда я меняю uiOutput на «textInput» («myModule-myInput», «A Text Input»), проблема сохраняется. Так это предназначено блестящим? Есть ли обходной путь? – shosaco

+0

Это функция R. Как и во всем R-коде, если вам нужно использовать нестандартное имя аргумента или переменной (например, одно, которое включает тире), вам также нужно будет использовать обратные элементы вокруг него. –

ответ

0

К сожалению для ответа на свой вопрос, но я думаю, что это что-то другие люди будут сталкиваться.

Использование ввода в javascript (т. Е. В состоянии условие состояния) возможно через input['myModule-myInputtest'] вместо точечной нотации, которая может использоваться в ситуациях без блестящих модулей.

0

Вам нужно сделать следующее:

* Использование tagList() внутри myModuleUI

* Не используйте нс() внутри MyModule

Примечание:

нс() объединяет id из callModule() с любой переданной ей строкой. Например нс ("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

Но идентификатор ввода должен быть модульным, т. Е. В пространстве имен myModule - в противном случае мне нужно отслеживать все входные идентификаторы в моем приложении, чтобы никто не назывался «myInputtest». Решением здесь является вызов 'session $ ns (« myInputtest »)' вместо просто ns(). Использование функции «tagList» не требуется для функциональности, только когда указано более 1 тега. Я думаю, что кавычки предназначены, но моим обходным путем было использование селектора списков ('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)