Обновление:
Я изменил строку в коде JavaScript, чтобы сделать его совместимым с IE / Rstudio Viewer. IE / Viewer выдал ошибку, потому что функция include()
не поддерживается ими, см. .includes () не работает в Internet Explorer . Вместо этого можно использовать indexOf()
.
Вы можете использовать javascript для проверки элемента ввода по id. Элемент может быть найден через
document.getElementById()
и затем вы можете определить тип через getAttribute('class')
и getAttribute('type')
.
Результаты могут быть "отправлены" в R через Shiny.onInputChange('inputType', ...);
и использованы в R через input$inputType
.
Первый пример функции:
getWidgetType <- function(widgetId){
paste0(
"elem = document.getElementById('", widgetId,"');
var message;
if(elem == null){
message = 'No input with id = ", widgetId," exists.'
}else{
// RStudio Viewer + IE workaround (dont have .include())
if(elem.getAttribute('class').indexOf('js-range-slider') > -1){
message = 'slider'
}else if (elem.nodeName == 'SELECT'){
message = 'select'
}else{
message = elem.getAttribute('type');
}
}
Shiny.onInputChange('inputType', message)
"
)
}
Обратите внимание, что я сделал пример для четырех входов: числовой, текстовый, selectInput и sliderInput. Если вы добавите дополнительные входные данные, возможно, вам придется проверить и другие атрибуты.
Воспроизводимый пример:
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
textInput("textInput", "id = textInput", "text"),
numericInput("numInput", "id = numInput", 10),
sliderInput("slideInput", "id = slideInput", 1, 10, 5),
hr(style = "height:1px;border:none;color:#333;background-color:#333;"),
textInput("widgetType", "widget type by id", "textInput"),
textOutput("widgetId")
)
server <- function(input, output, session) {
output$widgetId <- renderText({
runjs(getWidgetType(input$widgetType))
input$inputType
})
}
shinyApp(ui, server)