datatable( data, options = list(), class = "display", callback = JS("return table;"), rownames, colnames, container, caption = NULL, filter = c("none", "bottom", "top"), escape = TRUE, style = "auto", width = NULL, height = NULL, elementId = NULL, fillContainer = getOption("DT.fillContainer", NULL), autoHideNavigation = getOption("DT.autoHideNavigation", NULL), selection = c("multiple", "single", "none"), extensions = list(), plugins = NULL, editable = FALSE )
a data object (either a matrix or a data frame)
a list of initialization options (see
https://datatables.net/reference/option/); the character options
JS() will be treated as literal
options globally via
options(DT.options = list(...)), and
global options will be merged into this
options argument if set
the CSS class(es) of the table; see https://datatables.net/manual/styling/classes
table to be applied to the DataTables instance (i.e.
TRUE (show row names) or
FALSE (hide row names)
or a character vector of row names; by default, the row names are displayed
in the first column of the table if exist (not
if missing, the column names of the data; otherwise it can be
an unnamed character vector of names you want to show in the table header
instead of the default data column names; alternatively, you can provide a
named numeric or character vector of the form
'newName1' = i1,
'newName2' = i2 or
c('newName1' = 'oldName1', 'newName2' =
'oldName2', ...), where
newName is the new name you want to show in
the table, and
oldName is the index of the current
a sketch of the HTML table to be filled with data cells; by
default, it is generated from
htmltools::tags$table() with a table
header consisting of the column names of the data
the table caption; a character vector or a tag object
whether/where to use column filters;
none: no filters;
bottom/top: put column filters at the bottom/top of the table; range
sliders are used to filter numeric/date/time columns, select lists are used
for factor columns, and text input boxes are used for character columns; if
you want more control over the styles of filters, you can provide a list to
this argument of the form
list(position = 'top', clear = TRUE, plain
= FALSE), where
clear indicates whether you want the clear buttons
in the input boxes, and
plain means if you want to use Bootstrap
form styles or plain text input styles for the text input boxes
whether to escape HTML entities in the table:
to escape the whole table, and
FALSE means not to escape it;
alternatively, you can specify numeric column indices or column names to
indicate which columns to escape, e.g.
1:5 (the first 5 columns),
c(1, 3, 4), or
c(-1, -3) (all columns except the first and
c('Species', 'Sepal.Length'); since the row names take
the first column to display, you should add the numeric column indices by
one when using
'auto', and a **bslib** theme is
currently active, then bootstrap styling is used in a way that "just works"
for the active theme. Otherwise,
'default' styling is used. If set explicitly to
'bootstrap4', one must take care to ensure Bootstrap's HTML
dependencies (as well as Bootswatch themes, if desired) are included on the
page. Note, when set explicitly, it's the user's responsibility to ensure
that only one unique `style` value is used on the same page, if multiple
DT tables exist, as different styling resources may conflict with each other.
Width/Height in pixels (optional, defaults to automatic sizing)
An id for the widget (a random string by default).
TRUE to configure the table to automatically fill
it's containing element. If the table can't fit fully into it's container
then vertical and/or horizontal scrolling of the table cells will occur.
TRUE to automatically hide navigational UI
(only display the table body) when the number of total records is less
than the page size. Note, it only works on the client-side processing mode
and the `pageLength` option should be provided explicitly.
the row/column selection mode (single or multiple selection
or disable selection) when a table widget is rendered in a Shiny app;
alternatively, you can use a list of the form
list(mode = 'multiple',
selected = c(1, 3, 8), target = 'row', selectable = c(-2, -3)) to
pre-select rows and control the selectable range; the element
target in the list can be
'column' to enable column
'row+column' to make it possible to select both rows
and columns (click on the footer to select columns), or
select cells. See details section for more info.
a character vector of the names of the DataTables extensions (https://datatables.net/extensions/index)
a character vector of the names of DataTables plug-ins
(https://rstudio.github.io/DT/plugins.html). Note that only those
plugins supported by the
DT package can be used here. You can see
the available plugins by calling
FALSE to disable the table editor, or
"cell") to enable editing a single cell. Alternatively, you can set
"row" to be able to edit a row, or
"column" to edit a
"all" to edit all cells on the current page of the table.
In all modes, start editing by doubleclicking on a cell. This argument can
also be a list of the form
list(target = TARGET, disable =
list(columns = INDICES)), where
TARGET can be
INDICES is an
integer vector of column indices. Use the list form if you want to disable
editing certain columns. You can also restrict the editing to accept only
numbers by setting this argument to a list of the form
TARGET, numeric = INDICES) where
INDICES can be the vector of the
indices of the columns for which you want to restrict the editing to
"all" to restrict the editing to numbers for all columns.
If you don't set
numeric, then the editing is restricted to numbers
for all numeric columns; set
numeric = "none" to disable this
behavior. It is also possible to edit the cells in text areas, which are
useful for large contents. For that, set the
editable argument to a
list of the form
list(target = TARGET, area = INDICES) where
INDICES can be the vector of the indices of the columns for which
you want the text areas, or
"all" if you want the text areas for
all columns. Of course, you can request the numeric editing for some
columns and the text areas for some other columns by setting
editable to a list of the form
list(target = TARGET, numeric
= INDICES1, area = INDICES2). Finally, you can edit date cells with a
list(target = TARGET, date = INDICES); the target
columns must have the
Date type. If you don't set
editable list, the editing with the calendar is automatically
set for all
The argument could be a scalar string, which means the selection
mode, whose value could be one of
'multiple' (the default),
'none' (disable selection).
When a list form is provided for this argument, only parts of the
"full" list are allowed. The default values for non-matched elements are
list(mode = 'multiple', selected = NULL, target = 'row',
selectable = NULL).
target must be one of
selected could be
NULL or "indices".
selectable could be
or "indices", where
TRUE mean all the table is
FALSE, it means users can't select the table
by the cursor (but they could still be able to select the table via
ignore.selectable = TRUE).
If "indices", they must be all positive or non-positive values. All
positive "indices" mean only the specified ranges are selectable while all
non-positive "indices" mean those ranges are not selectable.
The "indices"' format is specified below.
The "indices"' format of
'column', it should be a plain
numeric vector; when
'row+column', it should be a
cols respectively, e.g.,
list(rows = 1, cols = 2); when
it should be a 2-col
matrix, where the two values of each row
stand for the row and column index.
Note that DT has its own selection implementation and doesn't
use the Select extension because the latter doesn't support the
server-side processing mode well. Please set this argument to
'none' if you really want to use the Select extension.
columnDefs is an option that provided by the DataTables library
itself, where the user can set various attributes for columns. It must be
provided as a list of list, where each sub-list must contain a vector named 'targets',
specifying the applied columns, i.e.,
list(list(..., targets = '_all'), list(..., targets = c(1, 2)))
columnDefs$targets is a vector and should be one of:
0 or a positive integer: column index counting from the left.
A negative integer: column index counting from the right.
A string: the column name. Note, it must be the names of the
original data, not the ones that (could) be changed via param
The string "_all": all columns (i.e. assign a default).
When conflicts happen, e.g., a single column is defined for some property
twice but with different values, the value that defined earlier takes the priority.
list(list(visible=FALSE, target=1), list(visible=TRUE, target=1))
results in a table whose first column is invisible.
See https://datatables.net/reference/option/columnDefs for more.
See https://rstudio.github.io/DT/ for the full documentation.
library(DT) # see the package vignette for examples and the link to website vignette('DT', package = 'DT') # some boring edge cases for testing purposes m = matrix(nrow = 0, ncol = 5, dimnames = list(NULL, letters[1:5])) datatable(m) # zero rows datatable(as.data.frame(m)) m = matrix(1, dimnames = list(NULL, 'a')) datatable(m) # one row and one column datatable(as.data.frame(m)) m = data.frame(a = 1, b = 2, c = 3) datatable(m) datatable(as.matrix(m)) # dates datatable(data.frame( date = seq(as.Date("2015-01-01"), by = "day", length.out = 5), x = 1:5 )) datatable(data.frame(x = Sys.Date())) datatable(data.frame(x = Sys.time()))
Run the code above in your browser using DataCamp Workspace