Как создать TextArea в качестве входа в Shiny webapp в R?
Я пытаюсь создать простой webapp, где я хочу использовать многострочный ввод от пользователя, используя элемент управления textarea HTML. Есть ли какой-либо из ящиков способ создания такого контроля ввода в Shiny?
Страница справки textInput не показывает много параметров
textInput {shiny} R Documentation
Create a text input control
Description
Create an input control for entry of unstructured text values
Usage
textInput(inputId, label, value = "")
Arguments
inputId
Input variable to assign the control value to
label
Display label for the control
value
Initial value
Value
A text input control that can be added to a UI definition.
Examples
textInput("caption", "Caption:", "Data Summary")
Ответы
Ответ 1
Вы можете добавить текстовое поле с помощью tags
, и оно должно быть автоматически захвачено Shiny:
tags$textarea(id="foo", rows=3, cols=40, "Default value")
Или, если вам более удобно с прямым HTML, вы также можете сделать
HTML('<textarea id="foo" rows="3" cols="40">Default value</textarea>')
В любом случае input$foo
должен отражать значение textarea.
Ответ 2
В интересах других, я опубликую, как я решил проблему, используя пользовательский интерфейс пользовательского интерфейса после Shiny tutorial
Во-первых, я создал файл textarea.js следующим образом
$(document).on("click", "textarea.inputTextarea", function(evt) {
// evt.target is the button that was clicked
var el = $(evt.target);
// Raise an event to signal that the value changed
el.trigger("change");
});
var inputTextareaBinding = new Shiny.InputBinding();
$.extend(inputTextareaBinding, {
find: function(scope) {
return $(scope).find(".inputTextarea");
},
getValue: function(el) {
return $(el).text();
},
setValue: function(el, value) {
$(el).text(value);
},
subscribe: function(el, callback) {
$(el).on("change.inputTextareaBinding", function(e) {
callback();
});
},
unsubscribe: function(el) {
$(el).off(".inputTextareaBinding");
}
});
Shiny.inputBindings.register(inputTextareaBinding);
Затем я добавил следующую функцию в ui.R из блестящего webapp до того, как shinyUI() называется
inputTextarea <- function(inputId, value="", nrows, ncols) {
tagList(
singleton(tags$head(tags$script(src = "textarea.js"))),
tags$textarea(id = inputId,
class = "inputtextarea",
rows = nrows,
cols = ncols,
as.character(value))
)
}
Затем я использовал выше определенную функцию для создания желаемого элемента управления textarea в ui.R
shinyUI(pageWithSidebar(
# Application title
headerPanel("Test Header Panel"),
sidebarPanel(),
mainPanel(
inputTextarea('exampleTextarea', '',20,35 )
)
))
Ответ 3
Может или не может быть релевантным здесь, но я сделал shinyAce пакет, чтобы обернуть и выставить текстовый редактор Ace в Shiny. Туз в основном используется для редактирования кода (в комплекте с подсветкой синтаксиса для разных языков), но предоставляет текстовый интерфейс для написания многострочного текста/кода.
Вы можете проверить пример, чтобы узнать, может ли это быть то, что вы ищете. (Попробуйте разные "режимы" для подсветки синтаксиса и тем для цветовых комбинаций.)
Ответ 4
Построение ответа Джо (fooobar.com/questions/187305/...), вы можете также вставлять теги в свою собственную функцию, чтобы добиться того же результата, что и стандартный встроенный вход Shiny функции.
textareaInput <- function(id, label, value, rows=20, cols=35, class="form-control"){
tags$div(
class="form-group shiny-input-container",
tags$label('for'=id,label),
tags$textarea(id=id,class=class,rows=rows,cols=cols,value))
}
Это способ избежать написания JS-кода (если вы хотите) в то же время...
- с функцией, которая вызывает то же самое, что и встроенные входы Shiny, и
- включает в себя стиль CSS с типом div, label и Bootstrap (так, чтобы он выглядел как встроенный элемент управления Shiny)
Использование функции такое же, как если вы используете встроенный или если вы создали пользовательский интерфейс.
textareaInput("textareaID","Text Area Label", "Insert text here...", rows = 20, cols = 35)
Ответ 5
Из версии 0.14 shiny имеет реализацию textAreaInput
.
Ответ 6
Здесь быстрое решение, которое сохраняет ощущение блестящего входа, но позволяет настраивать количество столбцов:
textareaInput <- function(inputID, label, value="", rows=10, columns=80) {
HTML(paste0('<div class="form-group shiny-input-container">
<label for="', inputID, '">', label,'</label>
<textarea id="', inputID, '" rows="', rows,'" cols="',
columns,'">', value, '</textarea></div>'))
}
В ui.R
script вы можете добавить:
textareaInput("shazam", "My text box")
Примечание. Чтобы получить значение Bootstrap в текстовом поле, вы можете использовать:
textareaInput <- function(inputID, label, value="", rows=10) {
HTML(paste0('<div class="form-group shiny-input-container">
<label for="', inputID, '">', label,'</label>
<textarea class="form-control" id="', inputID,
'" rows="', rows, '">', value, '</textarea></div>'))
}