如何创建TextArea作为R中闪亮的Web应用程序的输入?
我正在尝试创建一个简单的webapp,在这里我想使用HTML文本区域控件从用户那里接收多行输入。有没有现成的方法在Shiny中创建这样的输入控件 textInput的帮助页面没有显示太多选项如何创建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
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>'))
}