如何使用 R shiny 中的观察事件或其他反应函数更改 table 列 headers?
How to change table column headers using an Observe Event or other reactive function in R shiny?
下面的 MWE 代码工作正常,除了我想在用户单击“修改”操作按钮时将输出 table 列 headers 更改为按顺序排列的描述符,如图所示在底部的图像中。
在导出图像的输出时,我 运行 下面的 MWE 代码,单击“修改”操作按钮,然后在弹出的模式对话框中插入额外的 2 和 3 列进入顶部的输入矩阵。在下面显示的模态框底部呈现的那个小 table1
中(基本上是模态框顶部矩阵输入框的镜像),我想要列 headers如镜像所显示,自动地和顺序地生成。我想从模态对话框中呈现的这个 table1
开始,一旦弄清楚列 header 标记技术,我将把它添加到应用程序中呈现的其他 tables .
基本上,我只想在输出 tables 中将“V”替换为“Series”。
我还检查了 renderTable
的规格,希望有一个可以将 V 更改为其他内容的键,但我什么也没找到。
我错误地认为使用 observeEvent
和反应性很容易做到这一点,但我无法让它工作。毕竟,当 运行 我在 R studio 控制台(没有 Shiny)中使用下面的简单代码行时,它会改变 table 输出 headers 就好了——但我没有知道如何反应性地将其合并到 Shiny 中:
> default_mat <- matrix(c(1,24,0,1),4,1,dimnames=list(c("A","B","C","D"),NULL))
> colnames(default_mat) <- paste0("Series ", 1:ncol(default_mat))
> default_mat
这是我尝试将以上内容(概念上)拉入的 MWE 代码:
library(shiny)
library(shinyMatrix)
library(shinyjs)
default_mat <- matrix(c(1,24,0,1),4,1,dimnames=list(c("A","B","C","D"),paste0("Series ", 1:1)))
colnames(default_mat) <- paste0("Series ", 1:ncol(default_mat))
matrix3Input <- function(x, default_mat){
matrixInput(x,
label = 'Series terms:',
value = default_mat,
rows = list(extend = FALSE,names = TRUE),
cols = list(extend = TRUE,names = TRUE,editableNames = TRUE,delete = TRUE),
class = "numeric") # close matrix input
} # close function
ui <- fluidPage(
useShinyjs(),
titlePanel("Inputs"),
fluidRow(actionButton("modify","Modify"),
actionButton("show","Show"),
actionButton("hide","Hide"),
actionButton("reset","Reset"),
tableOutput("table2")
) # close fluid row
) # close fluid page
server <- function(input, output, session){
rv <- reactiveValues(mat = matrix3Input("matrix", default_mat),
input = default_mat,
colHeader = colnames(input)
) # close reactive values
hide("table2")
observeEvent(input$modify,{
showModal(modalDialog(
rv$mat,
tableOutput("table1"))
) # close show modal and modal dialog
hide("table2")
}) # close observe event
output$table1 <- renderTable({
rv$mat <- matrix3Input("matrix", input$matrix)
rv$input <- input$matrix
input$matrix
}, rownames = TRUE, colnames = TRUE)
observeEvent(input$show,{show("table2")})
observeEvent(input$hide, hide("table2"))
observeEvent(input$reset,{
hide("table2")
rv$input <- default_mat
rv$mat <- matrix3Input("matrix", default_mat)
}) # close observe event
output$table2 <- renderTable({
rv$input
}, rownames = TRUE)
} # close server
shinyApp(ui, server)
试试这个
output$table1 <- renderTable({
rv$mat <- matrix3Input("matrix", input$matrix)
# rv$input <- input$matrix
# input$matrix
df1 <- input$matrix
n <- dim(df1)[2]
colnames(df1) <- paste("Series", 1:n)
rv$input <- df1
df1
}, rownames = TRUE, colnames = TRUE)
下面的 MWE 代码工作正常,除了我想在用户单击“修改”操作按钮时将输出 table 列 headers 更改为按顺序排列的描述符,如图所示在底部的图像中。
在导出图像的输出时,我 运行 下面的 MWE 代码,单击“修改”操作按钮,然后在弹出的模式对话框中插入额外的 2 和 3 列进入顶部的输入矩阵。在下面显示的模态框底部呈现的那个小 table1
中(基本上是模态框顶部矩阵输入框的镜像),我想要列 headers如镜像所显示,自动地和顺序地生成。我想从模态对话框中呈现的这个 table1
开始,一旦弄清楚列 header 标记技术,我将把它添加到应用程序中呈现的其他 tables .
基本上,我只想在输出 tables 中将“V”替换为“Series”。
我还检查了 renderTable
的规格,希望有一个可以将 V 更改为其他内容的键,但我什么也没找到。
我错误地认为使用 observeEvent
和反应性很容易做到这一点,但我无法让它工作。毕竟,当 运行 我在 R studio 控制台(没有 Shiny)中使用下面的简单代码行时,它会改变 table 输出 headers 就好了——但我没有知道如何反应性地将其合并到 Shiny 中:
> default_mat <- matrix(c(1,24,0,1),4,1,dimnames=list(c("A","B","C","D"),NULL))
> colnames(default_mat) <- paste0("Series ", 1:ncol(default_mat))
> default_mat
这是我尝试将以上内容(概念上)拉入的 MWE 代码:
library(shiny)
library(shinyMatrix)
library(shinyjs)
default_mat <- matrix(c(1,24,0,1),4,1,dimnames=list(c("A","B","C","D"),paste0("Series ", 1:1)))
colnames(default_mat) <- paste0("Series ", 1:ncol(default_mat))
matrix3Input <- function(x, default_mat){
matrixInput(x,
label = 'Series terms:',
value = default_mat,
rows = list(extend = FALSE,names = TRUE),
cols = list(extend = TRUE,names = TRUE,editableNames = TRUE,delete = TRUE),
class = "numeric") # close matrix input
} # close function
ui <- fluidPage(
useShinyjs(),
titlePanel("Inputs"),
fluidRow(actionButton("modify","Modify"),
actionButton("show","Show"),
actionButton("hide","Hide"),
actionButton("reset","Reset"),
tableOutput("table2")
) # close fluid row
) # close fluid page
server <- function(input, output, session){
rv <- reactiveValues(mat = matrix3Input("matrix", default_mat),
input = default_mat,
colHeader = colnames(input)
) # close reactive values
hide("table2")
observeEvent(input$modify,{
showModal(modalDialog(
rv$mat,
tableOutput("table1"))
) # close show modal and modal dialog
hide("table2")
}) # close observe event
output$table1 <- renderTable({
rv$mat <- matrix3Input("matrix", input$matrix)
rv$input <- input$matrix
input$matrix
}, rownames = TRUE, colnames = TRUE)
observeEvent(input$show,{show("table2")})
observeEvent(input$hide, hide("table2"))
observeEvent(input$reset,{
hide("table2")
rv$input <- default_mat
rv$mat <- matrix3Input("matrix", default_mat)
}) # close observe event
output$table2 <- renderTable({
rv$input
}, rownames = TRUE)
} # close server
shinyApp(ui, server)
试试这个
output$table1 <- renderTable({
rv$mat <- matrix3Input("matrix", input$matrix)
# rv$input <- input$matrix
# input$matrix
df1 <- input$matrix
n <- dim(df1)[2]
colnames(df1) <- paste("Series", 1:n)
rv$input <- df1
df1
}, rownames = TRUE, colnames = TRUE)