textArea 的闪亮绑定 - 无法设置初始值
shiny binding for textArea - cannot set initial value
我在 Shiny 应用程序中使用 textArea 为 dplyr 的过滤动词提供输入。我使用闪亮的绑定,因此只有在按下 return 键后,输入才会传递给 dplyr。这工作得很好,除了我不能为 textArea 设置初始值。不幸的是,这在我的应用程序中很重要,因为它是我保存和恢复状态所依赖的功能。我可以为文本输入 (returnTextAreaInput1) 设置初始值,但不能为文本区域 (returnTextAreaInput2).
下面是我使用的R和js代码。如果您 运行 来自桌面的代码,您将看到 text_out1 显示初始值,而 text_out2 不显示。不幸的是我需要一个文本区域。
returnTextAreaInput1 <- function(inputId, label, value = "") {
tagList(tags$label(label, `for` = inputId), br(),
tags$input(id = inputId, type = "text", value = value,
class="returnTextArea form-control"))
}
returnTextAreaInput2 <- function(inputId, label, value = "") {
tagList(
tags$label(label, `for` = inputId),br(),
tags$textarea(id=inputId, type = "text", value = value, rows="3",
class="returnTextArea form-control")
)
}
setwd("~/Desktop")
ui <- basicPage(
includeScript("returnTextAreaBinding.js"),
returnTextAreaInput1("ret1", "Select 1:", "init text 1"),
returnTextAreaInput2("ret2","Select 2:", "init text 2"),
textOutput("text_out1"),
textOutput("text_out2")
)
server <- function(input, output, session) {
output$text_out1 <- renderPrint({
input$ret1
})
output$text_out2 <- renderPrint({
input$ret2
})
}
shinyApp(ui = ui, server = server)
下面是绑定的 js 代码。
// based on https://gist.github.com/xiaodaigh/7150112
var returnTextAreaBinding = new Shiny.InputBinding();
$.extend(returnTextAreaBinding, {
find: function(scope) {
return $(scope).find('.returnTextArea');
},
getId: function(el) {
return $(el).attr('id')
},
getValue: function(el) {
return el.value;
},
setValue: function(el, value) {
el.value = value;
},
subscribe: function(el, callback) {
$(el).on('keyup.textInputBinding input.textInputBinding', function(event) {
if(event.keyCode == 13) { //if enter key is pressed
callback()
}
});
},
unsubscribe: function(el) {
$(el).off('.textInputBinding');
},
receiveMessage: function(el, data) {
if (data.hasOwnProperty('value'))
this.setValue(el, data.value);
if (data.hasOwnProperty('label'))
$(el).parent().find('label[for=' + el.id + ']').text(data.label);
$(el).trigger('change');
},
getState: function(el) {
return {
label: $(el).parent().find('label[for=' + el.id + ']').text(),
value: el.value
};
},
getRatePolicy: function() {
return {
policy: 'debounce',
delay: 250
};
}
});
Shiny.inputBindings.register(returnTextAreaBinding, 'shiny.returnTextArea');
编辑:正如所建议的那样,此功能按预期工作
returnTextAreaInput <- function(inputId, label = "", value = "") {
tagList(
tags$label(label, `for` = inputId),br(),
tags$textarea(id=inputId, type = "text", rows="2",
class="returnTextArea form-control", value)
)
}
您可以添加 value
作为 tags$textarea
函数的第一个参数,默认情况下它将添加在 html textarea 标签之间:
returnTextAreaInput2 <- function(inputId, label, value = "") {
tagList(
tags$label(label, `for` = inputId),br(),
tags$textarea(value,id=inputId, type = "text", value = value, rows="3",
class="returnTextArea form-control")
)
}
我在 Shiny 应用程序中使用 textArea 为 dplyr 的过滤动词提供输入。我使用闪亮的绑定,因此只有在按下 return 键后,输入才会传递给 dplyr。这工作得很好,除了我不能为 textArea 设置初始值。不幸的是,这在我的应用程序中很重要,因为它是我保存和恢复状态所依赖的功能。我可以为文本输入 (returnTextAreaInput1) 设置初始值,但不能为文本区域 (returnTextAreaInput2).
下面是我使用的R和js代码。如果您 运行 来自桌面的代码,您将看到 text_out1 显示初始值,而 text_out2 不显示。不幸的是我需要一个文本区域。
returnTextAreaInput1 <- function(inputId, label, value = "") {
tagList(tags$label(label, `for` = inputId), br(),
tags$input(id = inputId, type = "text", value = value,
class="returnTextArea form-control"))
}
returnTextAreaInput2 <- function(inputId, label, value = "") {
tagList(
tags$label(label, `for` = inputId),br(),
tags$textarea(id=inputId, type = "text", value = value, rows="3",
class="returnTextArea form-control")
)
}
setwd("~/Desktop")
ui <- basicPage(
includeScript("returnTextAreaBinding.js"),
returnTextAreaInput1("ret1", "Select 1:", "init text 1"),
returnTextAreaInput2("ret2","Select 2:", "init text 2"),
textOutput("text_out1"),
textOutput("text_out2")
)
server <- function(input, output, session) {
output$text_out1 <- renderPrint({
input$ret1
})
output$text_out2 <- renderPrint({
input$ret2
})
}
shinyApp(ui = ui, server = server)
下面是绑定的 js 代码。
// based on https://gist.github.com/xiaodaigh/7150112
var returnTextAreaBinding = new Shiny.InputBinding();
$.extend(returnTextAreaBinding, {
find: function(scope) {
return $(scope).find('.returnTextArea');
},
getId: function(el) {
return $(el).attr('id')
},
getValue: function(el) {
return el.value;
},
setValue: function(el, value) {
el.value = value;
},
subscribe: function(el, callback) {
$(el).on('keyup.textInputBinding input.textInputBinding', function(event) {
if(event.keyCode == 13) { //if enter key is pressed
callback()
}
});
},
unsubscribe: function(el) {
$(el).off('.textInputBinding');
},
receiveMessage: function(el, data) {
if (data.hasOwnProperty('value'))
this.setValue(el, data.value);
if (data.hasOwnProperty('label'))
$(el).parent().find('label[for=' + el.id + ']').text(data.label);
$(el).trigger('change');
},
getState: function(el) {
return {
label: $(el).parent().find('label[for=' + el.id + ']').text(),
value: el.value
};
},
getRatePolicy: function() {
return {
policy: 'debounce',
delay: 250
};
}
});
Shiny.inputBindings.register(returnTextAreaBinding, 'shiny.returnTextArea');
编辑:正如所建议的那样,此功能按预期工作
returnTextAreaInput <- function(inputId, label = "", value = "") {
tagList(
tags$label(label, `for` = inputId),br(),
tags$textarea(id=inputId, type = "text", rows="2",
class="returnTextArea form-control", value)
)
}
您可以添加 value
作为 tags$textarea
函数的第一个参数,默认情况下它将添加在 html textarea 标签之间:
returnTextAreaInput2 <- function(inputId, label, value = "") {
tagList(
tags$label(label, `for` = inputId),br(),
tags$textarea(value,id=inputId, type = "text", value = value, rows="3",
class="returnTextArea form-control")
)
}