[英]R shiny datatable with numericinput and reactive column
我正在建立一个闪亮的数据表,其中一列用于数值输入,另一列对输入具有反应性。 这类似于您可以在单元格中嵌入方程式的情况下在excel中执行的操作。 我在下面以虹膜为例,并尝试计算花瓣面积。 因此,果皮面积等于花瓣长度*花瓣宽度/调整。 用户将输入Adjust参数来调整区域。 这里提出了类似的问题,但没有直接答案。 为每行插入一个数字输入-R Shiny
library(shiny)
library(DT)
library(dplyr)
ui <- basicPage(
DT::dataTableOutput('x1')
)
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)) 1 else value
}))
}
# a sample data frame
DF <- reactive(
iris <- iris %>%
mutate(
adjust = shinyInput(numericInput, nrow(iris), 'adj', value = 1),
Petal_Area = Petal.Length*Petal.Width/shinyValue('adj', nrow(iris))
)
)
# render the table containing shiny inputs
output$x1 = DT::renderDataTable(
# use slider to control number of rows shown in table
DF(), server = FALSE, escape = FALSE, options = list(
preDrawCallback = JS('function() {
Shiny.unbindAll(this.api().table().node()); }'),
drawCallback = JS('function() {
Shiny.bindAll(this.api().table().node()); } ')
)
)
}
shinyApp(ui, server)
这是一个不完整的答案。 希望其他用户可以对此进行改进。 如果没有,那么这是最好的答案。
我现在尝试了大约半小时,但是由于某种原因(也许是因为DT
不能像Excel一样使用),我无法在DT
-table中获得计算结果。 但是,如果不在DT
表中显示结果,反应性和计算就会起作用!
我只做了两个更改:
dplyr
并删除了计算 代码如下:
library(shiny)
library(DT)
ui <- basicPage(
DT::dataTableOutput('x1'),
tableOutput('debug')
)
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)) 1 else value
}))
}
# a sample data frame
DF <- reactive({
iris_adj <- iris
iris_adj$adjust<-shinyInput(numericInput, nrow(iris), 'adj', value = 1)
# iris_adj$Petal_area<-iris$Petal.Length*iris$Petal.Width/shinyValue('adj',nrow(iris))
return(iris_adj)
})
# render the table containing shiny inputs
output$x1 <- DT::renderDataTable(
# use slider to control number of rows shown in table
DF(), server = FALSE, escape = FALSE, options = list(
preDrawCallback = JS('function() {
Shiny.unbindAll(this.api().table().node()); }'),
drawCallback = JS('function() {
Shiny.bindAll(this.api().table().node()); } ')
)
)
output$debug<-renderTable({
cbind(DF()[,-6],shinyValue('adj',nrow(iris)),Petal_Area=iris$Petal.Length*iris$Petal.Width/shinyValue('adj',nrow(iris)))
})
}
shinyApp(ui, server)
一旦添加了计算, DT
输出就不会将其输出到调试表中。
就个人而言:我记得大约半年前使用了shinyInput
和shinyValue
技巧。 我还记得那是非常非常不稳定的。 我不会推荐给任何想要开发稳定应用的人
我还记得,还有另一个R-package用于完整的交互式表。 它被称为rhandsontables
。 也许尝试一下: https : //jrowen.github.io/rhandsontable/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.