Привет, переполнение стека,
в недавних вопросах я решил некоторые серьезные проблемы, связанные с динамически отображаемыми элементами пользовательского интерфейса и динамически созданными наблюдателями для них с помощью некоторых замечательных людей здесь. см., например, здесь: Динамически отображаемый пользовательский интерфейс: как удалить старые реактивные переменные при втором запуске
Теперь я создаю его часть, которая динамически отображает поля 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)