【问题标题】:How to create TextArea as input in a Shiny webapp in R?如何在 R 中的 Shiny webapp 中创建 TextArea 作为输入?
【发布时间】:2013-01-05 07:46:19
【问题描述】:

我正在尝试创建简单的 web 应用程序,我想在其中使用 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")

【问题讨论】:

    标签: r textarea textinput shiny


    【解决方案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 出现的任何位置。自定义控件可以工作,但内置的 textarea 绑定应该工作得更好一些,恕我直言:它也订阅 keyupinput 事件,并应用 250ms 去抖动。
    • 有没有像textInput 那样向textarea 添加标签的简单方法?
    • @jpd527 - 我知道这有点老了,但 Shiny 通过将标签和输入项放在
      元素中来做到这一点。您可以使用标签来完成此操作。
    【解决方案2】:

    为了他人的利益,我将在 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);
    

    然后我在调用 shinyUI() 之前在闪亮的 webapp 的 ui.R 中添加了以下函数

    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 )
      )
    ))
    

    【讨论】:

    • 你提到了一个闪亮的教程,但我还没有找到关于创建自定义控件的教程。那是哪个闪亮的教程?
    【解决方案3】:

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

    您可以check out the example 看看这是否是您想要的。 (尝试不同的“模式”进行语法高亮和颜色组合的主题。)

    【讨论】:

    • 听起来不错。是否有示例显示如何运行在编辑器中键入的代码?
    • 目前还没有……但这是我的项目待办事项清单上的下一个。这个月应该有一个例子。
    • 目前input$yourEditorsName的内容是字符串形式的文本?
    • 因此可以通过code &lt;- textConnection(input$yourEditorsName); source(code); close(code)server.R 中运行此代码吗?
    • 这可能会奏效。我设想的方法可能会遵循eval 模型:stackoverflow.com/questions/1743698/r-eval-expression
    【解决方案4】:

    0.14 版本开始,shiny 实现了textAreaInput

    【讨论】:

      【解决方案5】:

      根据 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)
      

      【讨论】:

        【解决方案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 脚本中,您可以添加:

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


        注意:要获得 Bootstrap 对 textarea 的感觉,您可以使用:

        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>'))
        }
        

        【讨论】:

          猜你喜欢
          • 2017-01-30
          • 2016-10-26
          • 2014-06-08
          • 2016-12-28
          • 2016-02-12
          • 1970-01-01
          • 2021-07-25
          • 1970-01-01
          • 2020-10-14
          相关资源
          最近更新 更多