【问题标题】:Use input expression in paste0 function in Shiny R在 Shiny R 的 paste0 函数中使用输入表达式
【发布时间】:2016-07-08 03:28:42
【问题描述】:

我有 140 个 renderUI 我想分配给对象。您可以像这样手动执行此操作:

Filter1 <- input$Filter1
...
Filter140 <- input$Filter140

我想让这个更自动化,但我无法在paste0 中获得input$Filter1:input$Filter140。我试过这个:

Filters<-c()
for(i in 1:140){
  Filters<-c(paste0('Filter',i),Filters)
}
for(i in Filters){
assign(i,input[[paste0(i)]])
}

我部分来自this other SO question。但它不工作.. 欢迎任何帮助。

ps。如果您需要完整的 ui.rserver.r 示例,请告诉我。虽然我认为这是足够的信息。

【问题讨论】:

  • 这可能无关紧要,但您在较低的代码块中使用大写的“F”,在较高的代码块中使用小写的“f”。是不是说找不到filter1
  • 谢谢,我很快就写了第一个块,但这并没有导致我的错误。我已经进行了编辑。
  • 您在哪里需要Filterx?你能不能通过在任何你可以调用Filterx的地方调用input[[paste0(Filter, x)]]来避免使用这个变量?
  • 与 Filterx 我只是说 Filter1 直到 Filter140。
  • @Tim_Utrecht 当然,我也是。问题依然存在。

标签: r loops shiny assign


【解决方案1】:

所以我相信assign 不会按照您希望的方式处理数据帧。试试这个:

Filters <- c()
input <- data.frame(x = "")
for (i in 1:140) {

  Filters <- c(paste0('Filter', i), Filters)

}

tail(Filters)
head(Filters)

for (i in Filters) {

  input[[i]] <- i

}

input <- input[, -1]

如果您希望在相反方向创建列,请更改行:

Filters <- c(paste0('Filter', i), Filters)

Filters <- c(Filters, paste0('Filter', i))

【讨论】:

  • 输入不是data.frame,它是用 Shiny 创建的。你确定它应该能用吗?
  • 我需要从 Filter1 到 Filter140 的对象,而不是 data.frame 中的所有值。
  • @Tim_Utrecht 啊,好吧,我对闪亮并不完全熟悉,但是输入某种可以访问的数组吗?语法似乎与数据框非常相似。另外,您是否遇到任何错误?
  • 它的行为可能类似于data.frame,但您无法更改它,因此您需要创建新对象。感谢您的提示,它让我朝着正确的方向前进。
【解决方案2】:

经过更多调查后,它似乎确实可以与 assign()input[[paste0(i)]] 函数一起使用: ui.r:

 library(shiny)

shinyUI(fluidPage(

  # Application title
  titlePanel("Old Faithful Geyser Data"),

  # Sidebar with a slider input for number of bins
  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)
    ),


    # Show a plot of the generated distribution
    mainPanel(
      selectInput("Filter1","Filter1",choices = c("A","B","C"),selected = "A"),
      selectInput("Filter2","Filter2",choices = c("AB","BC","CD"),selected = "AB"),
      selectInput("Filter3","Filter3",choices = c("ABC","BCD","CDF"),selected = "ABC"),
      plotOutput("distPlot")
    )
  )
))

server.r:

library(shiny)

shinyServer(function(input, output) {

  output$distPlot <- renderPlot({

    # generate bins based on input$bins from ui.R
    x    <- faithful[, 2]
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    #Filter1<-input$Filter1
    #print(Filter1)
    #print(input$Filter2)
    for(i in c("Filter1","Filter2","Filter3")){
    #Filter3 <- input[[paste0('Filter3')]]
    assign(i,input[[paste0(i)]])
      print(get(i))
    }
    # draw the histogram with the specified number of bins
    hist(x, breaks = bins, col = 'darkgray', border = 'white')



  })

})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2017-03-16
    • 2022-11-21
    相关资源
    最近更新 更多