在 DT 中嵌入具有混合 numericInput 和 selectInput 的列
Embed column with mixed numericInput and selectInput in DT
我想向接受 selectInput 或 numericInput 的 DT 添加一列,具体取决于变量。
例如,给定以下 DF:
df1 <- tibble(
var1 = sample(letters[1:3],10,replace = T),
var2 = runif(10, 0, 2),
id=paste0("id",seq(1,10,1))
)
DF=gather(df1, "var", "value", -id)
我想在 DF 中创建一个额外的列(使用 DT
),其中 selectInput 用于 var1
(choices= letters[1:3]) 和 numericInput 用于 var2
.
我找到了 实现 selectInput 的一个很好的例子,但是我不确定它如何与 numericInput 结合使用。
感谢任何帮助!
这是 的改编版本。
而不是gather
,使用最新版本tidyr
推荐的pivot_longer
。此外,在为新的 selector
列创建输入时,检查变量 name
。如果是 var1
使用 selectInput
,否则使用 numericInput
.
否则,应该以类似的方式工作。
library(shiny)
library(DT)
library(tidyverse)
df1 <- tibble(
var1 = sample(letters[1:3],10,replace = T),
var2 = runif(10, 0, 2),
id=paste0("id",seq(1,10,1))
)
# gather is retired, switch to pivot_longer
DF = pivot_longer(df1, cols = -id, names_to = "name", values_to = "value", values_transform = list(value = as.character))
ui <- fluidPage(
title = 'selectInput or numericInput column in a table',
DT::dataTableOutput('foo'),
verbatimTextOutput('sel')
)
server <- function(input, output, session) {
for (i in 1:nrow(DF)) {
if (DF$name[i] == "var1") {
DF$selector[i] <- as.character(selectInput(paste0("sel", i), "", choices = unique(df1$var1), width = "100px"))
} else {
DF$selector[i] <- as.character(numericInput(paste0("sel", i), "", NULL, width = "100px"))
}
}
output$foo = DT::renderDataTable(
DF, escape = FALSE, selection = 'none', server = FALSE,
options = list(dom = 't', paging = FALSE, ordering = FALSE),
callback = JS("table.rows().every(function(i, tab, row) {
var $this = $(this.node());
$this.attr('id', this.data()[0]);
$this.addClass('shiny-input-container');
});
Shiny.unbindAll(table.table().node());
Shiny.bindAll(table.table().node());")
)
output$sel = renderPrint({
str(sapply(1:nrow(DF), function(i) input[[paste0("sel", i)]]))
})
}
shinyApp(ui, server)
我想向接受 selectInput 或 numericInput 的 DT 添加一列,具体取决于变量。 例如,给定以下 DF:
df1 <- tibble(
var1 = sample(letters[1:3],10,replace = T),
var2 = runif(10, 0, 2),
id=paste0("id",seq(1,10,1))
)
DF=gather(df1, "var", "value", -id)
我想在 DF 中创建一个额外的列(使用 DT
),其中 selectInput 用于 var1
(choices= letters[1:3]) 和 numericInput 用于 var2
.
我找到了
感谢任何帮助!
这是
而不是gather
,使用最新版本tidyr
推荐的pivot_longer
。此外,在为新的 selector
列创建输入时,检查变量 name
。如果是 var1
使用 selectInput
,否则使用 numericInput
.
否则,应该以类似的方式工作。
library(shiny)
library(DT)
library(tidyverse)
df1 <- tibble(
var1 = sample(letters[1:3],10,replace = T),
var2 = runif(10, 0, 2),
id=paste0("id",seq(1,10,1))
)
# gather is retired, switch to pivot_longer
DF = pivot_longer(df1, cols = -id, names_to = "name", values_to = "value", values_transform = list(value = as.character))
ui <- fluidPage(
title = 'selectInput or numericInput column in a table',
DT::dataTableOutput('foo'),
verbatimTextOutput('sel')
)
server <- function(input, output, session) {
for (i in 1:nrow(DF)) {
if (DF$name[i] == "var1") {
DF$selector[i] <- as.character(selectInput(paste0("sel", i), "", choices = unique(df1$var1), width = "100px"))
} else {
DF$selector[i] <- as.character(numericInput(paste0("sel", i), "", NULL, width = "100px"))
}
}
output$foo = DT::renderDataTable(
DF, escape = FALSE, selection = 'none', server = FALSE,
options = list(dom = 't', paging = FALSE, ordering = FALSE),
callback = JS("table.rows().every(function(i, tab, row) {
var $this = $(this.node());
$this.attr('id', this.data()[0]);
$this.addClass('shiny-input-container');
});
Shiny.unbindAll(table.table().node());
Shiny.bindAll(table.table().node());")
)
output$sel = renderPrint({
str(sapply(1:nrow(DF), function(i) input[[paste0("sel", i)]]))
})
}
shinyApp(ui, server)