31

我正在尝试创建简单的 webapp,我想在其中使用 HTML textarea 控件从用户那里接收多行输入。在 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's 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")
4

6 回答 6

40

您可以使用添加一个文本区域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 的值。

于 2013-01-22T06:31:27.377 回答
26

为了他人的利益,我将在 Shiny 教程之后发布我如何使用自定义 UI 控件解决问题

首先,我创建了 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);

然后我在闪亮的 webapp 的 ui.R 中添加了以下函数,然后调用了 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))
    )
}

然后我使用上面定义的函数在 ui.R 中创建所需的 textarea 控件元素

shinyUI(pageWithSidebar(

  # Application title
  headerPanel("Test Header Panel"),

  sidebarPanel(),

  mainPanel(
        inputTextarea('exampleTextarea', '',20,35 )
  )
))
于 2013-01-22T06:43:49.880 回答
15

在这里可能相关也可能不相关,但我制作了shinyAce包来包装并在 Shiny 中公开 Ace 文本编辑器。Ace 主要用于代码编辑(包括各种语言的语法突出显示),但提供了一个类似于文本区域的界面,用于编写多行文本/代码。

您可以查看该示例,看看这是否是您正在寻找的。(尝试不同的“模式”用于语法突出显示和颜色组合的主题。)

于 2013-10-14T14:01:13.567 回答
5

From version 0.14 shiny has an implementation of textAreaInput.

于 2016-11-07T14:55:21.903 回答
3

根据 Joe 的回答 ( https://stackoverflow.com/a/14452837/5776618 ),您还可以将标签嵌套到您自己的函数中,以实现与标准 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 输入的相同方式调用的函数,并且
  • 包括 div、标签和 Bootstrap 的表单控件 CSS 样式(使其看起来像内置的 Shiny 输入控件)

使用该功能与使用内置或构建自定义 UI 相同。

textareaInput("textareaID","Text Area Label", "Insert text here...", rows = 20, cols = 35)
于 2016-01-12T05:11:30.413 回答
2

这是一个快速的解决方案,它保留了闪亮的输入感觉,但允许自定义列数:

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脚本中,您可以添加:

textareaInput("shazam", "My text box")


注意:要获得对 textarea 的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>'))
}
于 2016-03-08T01:04:58.137 回答