Динамические входы на основе вектора в Shiny - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь создать пользовательский интерфейс, который позволит пользователю изменять нечисловые входные данные (все они имеют ограничения, такие как <3), а затем сможет выполнить дальнейший анализ нового вектора.Скажем, например, что у них есть вектор X = (1, 2, 3, <1, 5, 3).Я хотел бы иметь числовой ввод с именем «<3», и любое введенное значение будет заменено. </p>

Я могу создать вход для каждого нечислового ввода, однако он имеет заголовокЯ хочу, и div-group блестящий-контейнер-ввода .

Когда я добавляю деталь, чтобы перезаписать копию оригиналаданные не компилируются, и я получаю сообщение об ошибке: 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 Ответ

1 голос
/ 24 сентября 2019

Итак, получается, что это можно сделать с помощью lapply и reactiveValuesToList, как показано ниже.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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...