如何将DT :: datatable分页按钮的显示文本设置为自定义字符串?

时间:2019-08-27 18:50:46

标签: javascript r dt

问题

在可视化数据时,我需要输出DT :: datatable。

数据表的要求1是将显示的表分为几页,其中不同的页面包含数据的不同子集。

在下面的示例中,我使用mtcars数据集,将其分为3个子集(4缸汽车,6缸汽车和8缸汽车),并在DT :: datatable的不同页面上显示这三个子集(分别在第1、2和3页上。

要求2是用户可以通过单击按钮移动到页面。通过使用DT :: datatable提供的默认分页功能,我们可以通过在实例化DT :: datatable时在选项列表中设置pagesaging = TRUE来实现此行为。这样,我们得到了分页按钮。在我的情况下,我设置pageingType =“ numbers”,因为每个页面只需要一个按钮,即没有“上一页”或“下一页”按钮。

现在是问题所在。

是否可以将分页按钮中的默认文本从“ 1”,“ 2”,“ 3”等更改为自定义文本?例如,在我们的mtcars示例中,我想将“ 1”,“ 2”,“ 3”更改为“ 4缸”,“ 6缸”和“ 8缸”。

更多背景知识和我已经尝试过的内容

默认的分页按钮(“ 1”,“ 2”,“ 3”,...)显示并正常工作,但是当我尝试更改其显示文本时,总是遇到某种问题。

以下是我的一些失败尝试:

  • 设置DT :: datatable选项的“语言”属性(您可以在下面的示例代码的带注释的部分中找到此失败的尝试),
  • 将initComplete属性设置为一个(非常幼稚的)JavaScript函数,该函数应该更改分页按钮的显示文本(也可以在示例代码的注释部分中找到)。

我认为只要具备合适的JavaScript知识即可轻松解决该问题,而我很遗憾不具备这些知识。

最终产品实际上是Microsoft Power BI中R支持的自定义视觉。因此,需要使用可以显示为HTML的数据对象。由于最终产品是Power BI中的自定义外观,因此我不希望涉及任何其他外部软件包。

非常感谢您的帮助!

require("DT")

data("mtcars")

# In our example, let's only look at Model Name and Number of Cylinders.
tmp_df <- data.frame("Model"=rownames(mtcars), "cyl"=mtcars$"cyl", stringsAsFactors=FALSE)

# Subset into 3 subsets, one for each possible
four_cyl <- tmp_df[tmp_df$cyl==4,]
six_cyl <- tmp_df[tmp_df$cyl==6,]
eight_cyl <- tmp_df[tmp_df$cyl==8,]

# For the sake of convenience, let all subsets have the same number of rows.
four_cyl <- four_cyl[c(1, 2, 3, 4), c(1, 2)]
six_cyl <- six_cyl[c(1, 2, 3, 4), c(1, 2)]
eight_cyl <- eight_cyl[c(1, 2, 3, 4), c(1, 2)]

# We want all pages in our DT::datatable to have the same number of rows.
page_length <- nrow(four_cyl)

# Bind the subsets of equal length together. This way it's easy to display 
# the different subsets on different pages in the DT::datatable.
output_df <- rbind(four_cyl, six_cyl, eight_cyl)

dt <- datatable(output_df,
                width = '400px',
                escape=FALSE, 
                rownames=FALSE,
                options=list(dom='rtp',
                             pagingType="numbers",
                             # language = list(
                             #   paginate = list(first = '4 cyl', second = '6 cyl', third = '8 cyl')
                             # ),
                             pageLength=page_length,
                             paging=TRUE,
                             lengthChange=TRUE,
                             ordering=FALSE,
                             info=FALSE,
                             searching=FALSE,
                             scrollX=FALSE,
                             columnDefs=list(list(width='60px', className='dt-center', targets='_all'))
                             #,
                             # initComplete = JS(
                             #   "function(settings, json) {",
                             #   "$(\"body\").children().each(function () {
                             #       $(this).html( $(this).html().replace(\">1<\", \">4 cyl<\") );
                             #       $(this).html( $(this).html().replace(\">2<\", \">6 cyl<\") );
                             #       $(this).html( $(this).html().replace(\">3<\", \">8 cyl<\") );
                             #     });",
                             #   "}"
                             # )
                ),
                class='cell-border stripe') %>% formatStyle(
                  columns = colnames(output_df), target='row', lineHeight='60%'
                )

print(dt)

所需的输出

DT :: datatable,其中分页按钮的文本已替换为“ 4缸”,“ 6缸”和“ 8缸”。另外,任何其他方法都可以在DT :: datatable的不同页面上显示不同的数据子集,并且我们可以使用带有自定义文本的按钮轻松地在不同的视图之间切换。

0 个答案:

没有答案