Как добавить элементы стиля к динамически отображаемому текстовому вводу в Shiny

Привет, переполнение стека,

в недавних вопросах я решил некоторые серьезные проблемы, связанные с динамически отображаемыми элементами пользовательского интерфейса и динамически созданными наблюдателями для них с помощью некоторых замечательных людей здесь. см., например, здесь: Динамически отображаемый пользовательский интерфейс: как удалить старые реактивные переменные при втором запуске

Теперь я создаю его часть, которая динамически отображает поля textInput. Рендеринг и мониторинг не должны быть проблемой, потому что я могу применить тот же способ кодирования, что и для кнопок действий, которые мы уже сделали, но стилизация этих элементов оказалась проблемой.

Насколько я знаю, есть 2 способа стилизовать элементы: добавить к ним tags$style(.....), например, 1:

tags$style(type="text/css", "#BatchName { width: 520px; position: relative;left: 7%}") 

в пользовательском интерфейсе

or 2:

actionButton(inputId= "Submit", label = icon("upload"),
                           style="color: blue; color: white; 
                           text-align:center; indent: -2px;
                           border-radius: 6px; width: 2px"),

Второй вариант также работает для динамического рендеринга, как показано в ссылке выше, и будет работать в приведенном ниже примере, если я должен был сделать actionButtons вместо textInput в цикле lapply в рабочем примере ниже. Однако элемент style = "...." внутри textInput() не работает.

Есть ли у кого-нибудь решение для динамического добавления стиля к текстовому вводу?

Решения, которые я пробовал, но потерпел неудачу:
динамическое создание элементов tags$head, но это не элемент пользовательского интерфейса, который можно было бы сделать с помощью renderUI(), я думаю

Каким-то образом текстовый ввод принимает аргумент style = " ").

Наконец, я взглянул на код функции textInput и задался вопросом, если план A или B не работает, можно ли изменить существующий код textInput в мою собственную функцию с большей свободой? textinput закодирован в пакете следующим образом:

function (inputId, label, value = "", width = NULL, placeholder = NULL) 
{
  value <- restoreInput(id = inputId, default = value)
  div(class = "form-group shiny-input-container", style = if (!is.null(width)) 
    paste0("width: ", validateCssUnit(width), ";"), label %AND% 
    tags$label(label, `for` = inputId), tags$input(id = inputId, 
    type = "text", class = "form-control", value = value, 
    placeholder = placeholder))
}

ПРИМЕР РАБОТЫ:

   library(shiny)
library(shinydashboard)
library(shinyBS)


ui <- dashboardPage(
  dashboardHeader(title = "My Test App"),
  dashboardSidebar(
    sidebarMenu(id = "tabs", menuItem("testpage", tabName = "testpage", icon = icon("book"))
    )
  ),

  dashboardBody(
    tags$head(tags$style(HTML('.skin-blue .content-wrapper, .right-side {background-color: #ffffff; }, '))),


    tabItems(

      ### test page ###_________
      tabItem(tabName = "testpage",  

              h5("Enter desired nr of elements here"),
              textInput(inputId ="NrOfClusters", label = NULL , placeholder = "NULL"),


              uiOutput("NameFields")
      ))))




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

  ################# start functionality HOME TAB #############################  

  ### create 2 reactive environment lists
  values <- reactiveValues(clickcount=0)
  DNL <- reactiveValues(el=NULL)

  ### set initial state of two buttons 
  values$HL_multi_switch_sf1 <- FALSE
  values$HL_all_switch_sf1 <- FALSE 

  ### if the user types in a value, then convert it to a reactive value of this nr
  observeEvent (input$NrOfClusters, {
    values$nrofelements <- input$NrOfClusters
    namelist <- as.character(unlist(DNL$el), use.names = FALSE)
  })

  AddNameField <- function(idx){
    sprintf("highlight_button_sf1-%s-%d",values$nrofelements,idx)
  }




  #### RENDER DYNAMIC UI and DYNAMIC OBSERVERS
  observeEvent(values$nrofelements, {
    req(input$NrOfClusters)
    nel <- values$nrofelements
    DNL$el <- rep(0,nel) 
    names(DNL$el) <- sapply(1:nel,AddNameField)

    output$NameFields <- renderUI({
         lapply(1:values$nrofelements, function(ab) {
          div(br(), textInput(inputId = AddNameField(ab), label = NULL))
      })
    })

    lapply(1:values$nrofelements,  function(ob) {
      textfieldname <- AddNameField(ob)
      print(textfieldname)
      observeEvent(input[[textfieldname]], {

        DNL$el[[ob]] <- input[[textfieldname]]
        namelist <- as.character(unlist(DNL$el), use.names = FALSE)
        print(namelist)
        })

    })
  })
  }
options(shiny.reactlog = TRUE)
shinyApp(ui,shinyServer)

person Mark    schedule 15.05.2017    source источник
comment
Думаю, я нашел ответ. По счастливой случайности я оказался в статье/вопросе Stackoverflow, которые изначально не отображались в моем обширном поиске по ключевым словам. stackoverflow.com /questions/37298498/ Я опубликую рабочую версию своего кода из вопроса, который я разместил здесь, как только у меня будет время переписать его   -  person Mark    schedule 24.05.2017