html - 如何使用 DTedit 和 shiny::uiOutput 在列中引入新行?
问题描述
我正在使用 DTedit pckg 在闪亮的应用程序中显示数据框(mydata),因为这个简单的 R pckg 允许我以非常简单的方式添加/编辑行。到目前为止,一切都很好。但是,我想在 Var2 列中引入一个新行(或换行符),将 FIRST 与 SECOND 行分开,将 THIRD 与 FOURTH 行分开。
我已经能够使用 DT::dataTableOutput (下面的选项 1)来做到这一点。但是,DTedit 似乎只适用于 shiny::uiOutput,我无法在那里引入新行(选项 2)。我已经阅读了有关 div() 的内容,但我现在完全一无所知。
有人可以阐明如何使用 Dtedit 在数据框的列中引入新行 - 因此闪亮::uiOutput?
注意:我已经得出结论,shiny::uiOutput 是这里的问题,因为这是我可以看到的两个选项之间唯一的“明显”差异。但这只是我,我缺少的东西可能不太明显。
PD:这是我的第一篇文章,所以如果可以做得更好,请告诉我。谢谢!
# OPTION 1: using DT (DT::dataTableOutput) (WORKING)
ui = fluidPage(
h3("New line works when using DT (DT::dataTableOutput)",
mainPanel(
DT::dataTableOutput("mytable")
)
)
)
server = function(input, output){
#dataframe
mydata <- data.frame(Var1 = c("a", "b"),
Var2 = c("FIRST LINE: first; SECOND LINE: second",
"THIRD LINE: third; FOUR LINE: four"))
#Subtitute semicolon by break line based on
#https://stackoverflow.com/questions/26368192/how-to-insert-new-line-in-r-shiny-string
mydata$Var2 <- gsub(pattern = "; ", replacement = "<br/>", mydata$Var2)
#render table
output$mytable = DT::renderDataTable(escape = F,
mydata
)
}
shinyApp(ui = ui, server = server, options = list(height = 1080))
# OPTION 2: using DTedit, therefore shiny::uiOutput, (not working)
ui = fluidPage(
h3("New line does not work when using DTedit-shiny::uiOutput"),
mainPanel(
shiny::uiOutput("mytable")
)
)
server = function(input, output){
#dataframe
mydata <- data.frame(Var1 = c("a", "b"),
Var2 = c("FIRST LINE: first; SECOND LINE: second",
"THIRD LINE: third; FOUR LINE: four"))
#Subtitute semicolon by break line based on
#https://stackoverflow.com/questions/26368192/how-to-insert-new-line-in-r-shiny-string
mydata$Var2 <- gsub(pattern = "; ", replacement = "<br/>", mydata$Var2)
#render table
output$mytable = DT::renderDataTable(escape = F,
DTedit::dtedit(input, output,
name = 'mytable',
thedata = mydata)
)
}
shinyApp(ui = ui, server = server, options = list(height = 1080))
想要的结果:
到目前为止的实际结果:
解决方案
这可以通过在render
函数中的 JavaScript 中进行替换来实现:
server = function(input, output){
#dataframe
mydata <- data.frame(Var1 = c("a", "b"),
Var2 = c("FIRST LINE: first; SECOND LINE: second",
"THIRD LINE: third; FOUR LINE: four"))
#render table
DTedit::dtedit(
input, output,
name = 'mytable',
thedata = mydata,
datatable.options = list(
columnDefs = list(
list(targets=1,
render = JS("function(data){return data.replace(/;/g, '<br>');}"))
)))
}
推荐阅读
- r - 如何使用字符串作为函数的正式形式运行函数?
- azure - Azure 存储队列最大并发客户端数
- sql - 从查询中获取 2019 年结果
- django - 调试工具栏 django 未执行
- c# - 传入字典的模型项在我的代码中属于类型错误
- javascript - 尝试将事件从其组件之一传播到自定义 HTML 元素会抛出
- node.js - 如何在nodejs中使用openssl生成公钥/私钥对?
- c# - 将事件的订阅者复制到派生对象
- angular - Angular6 - 如何使用服务渲染组件
- android - java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.net.Uri android.content.Intent.getData()”