基于Shiny中向量的动态输入

时间:2019-09-20 16:05:56

标签: r shiny

我正在尝试创建一个UI,该UI将允许用户更改非数字输入(它们都是诸如<3的限制),然后可以对新向量进行进一步的分析。 假设他们有一个向量X =(1、2、3,<1、5、3)。我希望有一个名为“ <3”的数字输入,无论输入什么值,它都将被替换。

我能够为每个非数字输入创建输入,但是它具有我想要的标题, div表单组“ shiny-input-”容器

当我添加该部分以覆盖原始数据的副本时,它不会编译,并且出现错误消息: Warning: Error in subset.default: argument "subset" is missing, with no default

到目前为止,我能做的最好的事情是:

l <- c(1,2,3,4,5,7, '<1', 4,5, 7, '<3') # Example input

library(shiny)

ui <- fluidPage(

   titlePanel("Plot non numeric Data"),

   sidebarLayout(
      sidebarPanel(
         uiOutput("LowerLimits")
      ),

      mainPanel(
         plotOutput("distPlot")
      )
   )
)

server <- function(input, output) {

  l2 = l

  data <- reactiveValues(nonN = factor(l[which(is.na(suppressWarnings(as.numeric(l))))]) )

  # Bad bit of code
  output$LowerLimits <- renderUI({
    LL <- list()
    if(length(data$nonN) > 0){
      for(i in 1:length(data$nonN)){
        assign(paste("Test", levels(data$nonN)[i]),numericInput(levels(data$nonN)[i],paste("Test", levels(data$nonN)[i]), value = NULL) )
        LL <- c(LL, get(paste("Test", levels(data$nonN)[i])))
      }
    }
    LL
  })

  # Really bad bit of code that crashes the app
  observe({
    if(length(data$nonN) > 0){
      for(i in 1:length(data$nonN)){
        l2[which(is.na(suppressWarnings(as.numeric(l))))][i] = subset(x = input, select = levels(data$nonN)[i])
      }
    }
  })



   output$distPlot <- renderPlot({
      plot(l2)
   })
}

# Run the application 
shinyApp(ui = ui, server = server)


有什么办法 1)输入中没有* div form-group ...`部分 2)能够更改我的数据

第一行的示例输入就是一个示例。它可以具有任何长度,可以是任意数量的数字或非数字值。

谢谢。

1 个答案:

答案 0 :(得分:1)

因此,事实证明可以使用lapplyreactiveValuesToList完成此操作,如下所示。还需要使用unique参数在多个空格中添加nonN,因为也可以使用重复的非数字输入(我忘了提及,但是很容易解决)。最终的代码是:

l <- c(1,2,3,4,5,7, '<1', 4,5, 7, '<3', '<3')

library(shiny)
test = NULL

ui <- fluidPage(

  titlePanel("Plot non numeric Data"),

  sidebarLayout(
    sidebarPanel(
      uiOutput("LowerLimits")
    ),

    mainPanel(
      plotOutput("distPlot")
    )
  )
)

server <- function(input, output) {

  l2 = l
  data <- reactiveValues(nonN = factor(l[which(is.na(suppressWarnings(as.numeric(l))))]) )

  # Bad bit of code
  output$LowerLimits <- renderUI({
    if(length(unique(data$nonN)) > 0){
      lapply(1:length(unique(data$nonN)), function(i){
        numericInput(levels(data$nonN)[i],paste("Test", levels(data$nonN)[i]), value = NULL)
      })
    }
  })

  # Really bad bit of code

  output$distPlot <- renderPlot({
    if(length(data$nonN) > 0){
      for(i in 1:length(unique(data$nonN))){
        l2[l2 == levels(unique(data$nonN))[i]] = subset(as.matrix(t(reactiveValuesToList(input))), select = levels(unique(data$nonN))[i])
      }
    }
    plot(as.numeric(l2))
  })
}

# Run the application 
shinyApp(ui = ui, server = server)