如何在 R Shiny 中更改数字输入框的位置

Posted

技术标签:

【中文标题】如何在 R Shiny 中更改数字输入框的位置【英文标题】:How to change location of numeric input boxes in R Shiny 【发布时间】:2021-04-24 02:07:47 【问题描述】:

现在,输入框显示在一个下方。我希望能够将它们显示在一个矩阵中,这样就有input$numoc 行和input$inp1 列。

用户界面

numericInput("cols", "Enter number of columns:",min=1,1),
numericInput("rows", "Enter number of rows:",min=1,1)

服务器

output$matrixx <- renderUI(
    k= rep(c(1:input$rows), times = input$cols)
    mx<-max(input$rows,input$cols)
    lllist <- lapply(1:(input$cols*input$rows), function(i, j=((i-1)%/%input$rows)+1, y=k[[i]]) 
        iids <- paste("inp2", i, sep="")
        names<- paste("Treatment #",j," Outcome #",y,sep="")
        list(
            numericInput(iids,names, value=0, min=0, max=1, step=0.05)
        )
    )
    do.call(tagList, unlist(lllist, recursive = FALSE))
)

【问题讨论】:

听起来你在问一个闪亮的网格布局? shiny.rstudio.com/articles/layout-guide.html 是的,谢谢,我看过了,但它没有做我想做的事。它只是将输入框向右移动一点。 @XL 如果您想删除问题,请执行此操作。不要删除文本。人们花了很多时间来回答你的问题 实际上,我认为您可以删除一个问题,一旦它有赞成的答案。 【参考方案1】:

当然,我们可以在renderUI 中添加fluidRowcolumn 来实现这一点。

这是一个最小的例子:

library(shiny)

ui <- fluidPage(
  
    numericInput("cols", "Enter number of columns:", min = 1, max = 4, 2), 
    numericInput("rows", "Enter number of rows:",    min = 1, 2),
    hr(),
    
    uiOutput("matrixx")
    
)

server <- function(input, output, session) 
  
    output$matrixx <- renderUI(
        
        ui_parts <- c()
        
        for(i in 1:input$rows)
            
            ui_parts[[i]] <- fluidRow(
                
                if(input$cols >= 1) 
                    column(3, 
                        textInput(
                            inputId = paste0("id", i + 10),
                            label   = paste0("id", i + 10) 
                        )
                    )
                ,
                if(input$cols >= 2) 
                    column(3, 
                        textInput(
                            inputId = paste0("id", i + 20),
                            label   = paste0("id", i + 20) 
                        )
                    )
                ,
                if(input$cols >= 3) 
                    column(3, 
                       textInput(
                           inputId = paste0("id", i + 30),
                           label   = paste0("id", i + 30) 
                       )
                    )
                ,
                if(input$cols >= 4) 
                    column(3, 
                       textInput(
                           inputId = paste0("id", i + 40),
                           label   = paste0("id", i + 40) 
                       )
                    )
                
            )
        
        
        ui_parts

    )
    


shinyApp(ui, server)

为简单起见,我将其限制为 4 列,并以更重复但更易于阅读的格式编写。以额外的复杂性为代价,您可以使其与更多列一起使用,并通过使用额外的循环来缩短它。

【讨论】:

谢谢!我怎样才能使它适用于任意数量的列?在 4 列之后,它们不再出现在彼此旁边【参考方案2】:

这是一种方法,用两个lapply 语句划分行和列。您可以添加 column 并使用静态值或动态设置 width,具体取决于元素的数量。

我还添加了verbatimTextOutput 以显示在数字输入中输入的值作为演示。

library(shiny)

ui <- fluidPage(
  numericInput("cols", "Enter number of columns:", min = 1, 1),
  numericInput("rows", "Enter number of rows:", min = 1, 1),
  verbatimTextOutput("values"),
  uiOutput("matrixx")
)

server <- function(input, output, session) 
  output$matrixx <- renderUI(
    lapply(seq(input$cols), function(i) 
      column(width = 4,
             lapply(seq(input$rows), function(j) 
               numericInput(paste0("inp2", i, "_", j), 
                            paste0("Treatment #", j, " Outcome #", i),
                            value = 0, min = 0, max = 1, step = 0.05)
             ))
    )
  )
  output$values = renderPrint(
    str(
      lapply(seq(input$cols), function(i) 
        lapply(seq(input$rows), function(j) 
          input[[paste0("inp2", i, "_", j)]]
        )
      )
    )
  )


shinyApp(ui, server)

【讨论】:

谢谢!我怎样才能使它适用于任意数量的列? @XL 这应该适用于任意数量的列。当为numericInput input$cols 输入更多列时,它是否没有提供正确的设置?或者请进一步描述您的需求。 一旦列数达到 4,它们开始出现在第一列的下方。该应用程序不允许超过 3 列。也许有办法添加一个水平滚动条来解决这个问题? 我在原帖中加入了一张图片 是否有最大列数?有 12 列宽,上面我任意指定了 4 列宽(因此适合 3 列 4 宽,4x3=12)。你可以制作一个向量,包括你想要的 1 到 6 列左右的宽度......或者在数学上估计宽度应该基于input$cols。或者,如果您想要小的输入,您可以使用 width = 2,它最多可以跨 6 列...或 width = 1 跨 12 列...

以上是关于如何在 R Shiny 中更改数字输入框的位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R Shiny 中更改框的折叠/展开按钮的颜色?

如何在 R Shiny 中使用变量名访问辅助输入?

如何将字符串输入(带空格的数字)转换为Shiny(R)中的数据帧?

R-Shiny:在文件输入上选择输入反应

当我对数据框进行更改时,Shiny 中 1 个选择器输入的输出会自动更新

如何在 Shiny 中更改选择器输入的字体大小?