俺最近打算学习一下 DT 包,学习方法就是照着 reactable 包的demo用 DT 复现出来,但是一直没琢磨出来怎么往一列数据中插入图片。基本思路是用JS()
调 Javascript 调 html 来实现,但是失败了。
reactable demo 代码
需要插入的图片位置:https://github.com/glin/reactable/tree/main/vignettes/womens-world-cup
```{r}
forecasts <- data.frame(
team = c(
'USA', 'France', 'Germany', 'Canada', 'England', 'Netherlands', 'Australia', 'Sweden', 'Japan', 'Brazil', 'Spain', 'Norway', 'China', 'Italy', 'New Zealand', 'Nigeria', 'Cameroon', 'South Korea', 'Scotland', 'Argentina', 'Chile', 'South Africa', 'Thailand', 'Jamaica'),
points = c(
'6', '6', '6', '6', '6', '6', '3', '6', '4', '3', '3', '3', '3', '6', '0', '3', '0', '0', '0', '1', '0', '0', '0', '0'))
library(reactable)
library(htmltools)
reactable(forecasts,
columns = list(
team = colDef(
defaultSortOrder = "asc",
minWidth = 200,
headerStyle = list(fontWeight = 700),
cell = function(value, index) {
div(img(
alt = paste(value, "flag"),
src = sprintf("images/%s.png", value)
),
div(value),
div(sprintf("%s pts.", forecasts[index, "points"])))
}
),
points = colDef(show = FALSE)
))
```
JS()里面为撒要插入反斜杠\
因为主要解题思路是使用回调函数,但又对 Javascript 不熟,所以问题也没解开,回调函数也不会写。在实现“插入图片”之前,想的是先照着网上的原生js代码搬到R里面实现试试,但是也失败楽。
DT 网站搬来的代码
'<span title=\"' + data + '\">'
这里为撒要加上反斜杠符号呢?
```{r}
library(DT)
library(htmlwidgets)
DT::datatable(forecasts,
rownames = FALSE,
options = list(columnDefs = list(list(
targets = 0,
render = JS(
"function(data, type, row, meta) {
return type === 'display' && data.length > 6 ?
'<span title=\"' + data + '\">' + data.substr(0, 6) + '...</span>':data;
}"
)
))))
```
照着原生js搬的代码
网上找的 DT 包对应的 DataTables 的代码https://www.jianshu.com/p/579e6664c226,比如第一个例子中的checkbox,搬到R里面,会报错,"function(data, type, row, meta) {
这一行报的错是“expected ',' after expression”,执行后会报如下错。难道在JS()
里面写类似<input />
或者<img />
之类的 html 元素时需要在哪里加上反斜杠才正常吗?
Error: unexpected symbol in:" "function(data, type, row, meta) { return '<input type="checkbox"
```{r}
DT::datatable(forecasts[, c('team', 'points', 'group')],
rownames = FALSE,
options = list(columnDefs = list(list(
targets = 0,
render = JS(
"function(data, type, row, meta) {
return '<input type="checkbox" name="checklist" value="'+ row.name + '"/>'
}"
)
))))
```