我正在尝试创建一个Shiny应用程序,该应用程序允许用户编辑数据表,从而保存编辑内容。这是一个最小的示例:
library(shiny)
library(DT)
ui <- fluidPage(
DT::DTOutput('df')
)
server <- function(session, input, output){
df <- data.frame(x = factor(c("A", "B", "C"), levels = c("A", "B", "C")))
output$df <- DT::renderDT(df,
editable = T)
proxy <- dataTableProxy("df")
observeEvent(input$df_cell_edit, {
info <- input$df_cell_edit
str(info)
i <- info$row
j <- info$col
v <- info$value
df[i, j] <<- DT:::coerceValue(v, df[i, j])
replaceData(proxy, df, resetPaging = FALSE)
})
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
这使我可以编辑内联的值x
,但是由于这x
是一个因素,因此我想限制用户能够输入的值。理想情况下,我希望使用下拉菜单来完成此操作。使用DT :: datatable和Shiny可以实现此功能吗?
注意:我知道该rhandsontable
软件包,但是,如果可能的话,我宁愿使用DT。
我不精通 Javascript,想复制rhandsontable包中可用的下拉功能,但用于DT包。
如何以最有效的方式实现这一目标?
例子
library(DT)
i <- 1:5
datatable(iris[1:20, ],
editable = T,
options = list(
columnDefs = list(
list(
targets = 5,
render = JS(
# can't get my head around what should be in the renderer...
)
))
))
Run Code Online (Sandbox Code Playgroud)
目标是让i
变量充当允许输入的验证器DT
对象中。
任何帮助深表感谢!
我希望我的数据表显示取决于表中复选框状态的内容。我找到了两者的帮助,包括DT中的复选框以及更改数据表的内容,但是当我尝试将这些解决方案组合在一起时,却没有得到想要的东西。选中一个框时,该表将重绘两次,这是我想要的第一次,但稍后又切换回去。
这是几乎应该执行的代码...在我发疯之前是否有人在帮忙?
library(shiny)
library(DT)
shinyApp(
ui = fluidPage(
DT::dataTableOutput('x1'),
verbatimTextOutput('x2')
),
server = function(input, output, session) {
# create a character vector of shiny inputs
shinyInput = function(FUN, len, id, ...) {
inputs = character(len)
for (i in seq_len(len)) {
inputs[i] = as.character(FUN(paste0(id, i), label = NULL, ...))
}
inputs
}
# obtain the values of inputs
shinyValue = function(id, len) {
unlist(lapply(seq_len(len), function(i) {
value = input[[paste0(id, i)]]
if (is.null(value)) TRUE else value
}))
}
n = …
Run Code Online (Sandbox Code Playgroud)