Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建TextArea作为R中闪亮的Web应用程序的输入?_R_Textarea_Textinput_Shiny - Fatal编程技术网

如何创建TextArea作为R中闪亮的Web应用程序的输入?

如何创建TextArea作为R中闪亮的Web应用程序的输入?,r,textarea,textinput,shiny,R,Textarea,Textinput,Shiny,我正在尝试创建一个简单的webapp,在这里我想使用HTML文本区域控件从用户那里接收多行输入。有没有现成的方法在Shiny中创建这样的输入控件 textInput的帮助页面没有显示太多选项 textInput {shiny} R Documentation Create a text input control Description Create an input control for entry of unstructured text values Usage text

我正在尝试创建一个简单的webapp,在这里我想使用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'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")

您可以使用
标记添加文本区域,该文本区域应通过以下方式自动拾取:

tags$textarea(id="foo", rows=3, cols=40, "Default value")
或者,如果您对直接HTML更满意,您也可以这样做

HTML('<textarea id="foo" rows="3" cols="40">Default value</textarea>')
HTML('Default value')

无论哪种情况,
input$foo
都应该反映textarea的值。

为了其他人的利益,我将在下面的教程中介绍如何使用自定义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()之前,我在Shinny 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))
    )
}

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


你可以看看这是否就是你想要的。(尝试不同的“模式”来突出显示语法和颜色组合的主题。)

基于Joe的答案(),您还可以将标记嵌套到自己的函数中,以实现与标准内置输入函数相同的输出

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

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

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

从版本开始,shiny有一个。

的实现,虽然它指向正确的方向,但不清楚在哪里添加上面的行。我刚开始创建自定义控件。上面的行(一行或另一行,而不是两行)应该添加到您希望textarea出现的任何位置。自定义控件可以工作,但内置的textarea绑定应该工作得更好一点,IMHO:它订阅
keyup
input
事件,并应用250ms去Bounce。是否有一种简单的方法可以像
textInput
那样向
textarea
添加标签?@jpd527-我知道这有点旧,但是Shiny通过将标签和输入项放在元素中来实现这一点。你可以使用标签来完成这项工作。听起来很棒。是否有一个示例显示如何运行编辑器中键入的代码?目前还没有。。。但这是我下一个要做的项目。本月应该会发布一个示例。目前,
input$yourEditorsName
的内容是以字符串形式显示的文本?因此,通过执行可能有效的
代码,可以在
server.R
中运行此代码。我所设想的方法可能会遵循
eval
模型:您提到了一个闪亮的教程,但我还没有找到一个关于创建自定义控件的教程。那是哪本书?
textareaInput("textareaID","Text Area Label", "Insert text here...", rows = 20, cols = 35)
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>'))
}
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>'))
}