Подтвердить что ты не робот

Как создать 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")
4b9b3361

Ответ 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>'))
}