Ошибка переключения в R: замена имеет нулевую длину

#r #shiny

#r #блестящий

Вопрос:

Итак, я получаю ошибку: Ошибка в ans [p] <- switch (val [p], v1 = m [1], v2 = m[2], v3 = m [3], v4 = m [4], : замена имеет нулевую длину, и я понятия не имеюв чем может быть проблема.

Значения m представляют собой строки, соответствующие названиям шести популярных игр, и я пытаюсь отсортировать имена на основе значений из нормального распределения с помощью переключателя.

Код:

 library("shiny")

ui <- fluidPage(
  
  titlePanel(h1(strong("Game Selector"))),
  
  sidebarLayout(
    
    sidebarPanel(
      selectInput("I1","Game You Want to Play Most", choices = c("Ark", "Divinity", "Dark_Souls_1", "Dark_Souls_3", "Pokemon", "Factorio"), selected = "ark"),
      selectInput("I2","Game You Want to Play Most", choices = c("Ark", "Divinity", "Dark_Souls_1", "Dark_Souls_3", "Pokemon", "Factorio"), selected = "Divinity"),
      selectInput("I3","Game You Want to Play Most", choices = c("Ark", "Divinity", "Dark_Souls_1", "Dark_Souls_3", "Pokemon", "Factorio"), selected = "Pokemon"),
      selectInput("I4","Game You Want to Play Most", choices = c("Ark", "Divinity", "Dark_Souls_1", "Dark_Souls_3", "Pokemon", "Factorio"), selected = "Dark_Souls_1"),
      selectInput("I5","Game You Want to Play Most", choices = c("Ark", "Divinity", "Dark_Souls_1", "Dark_Souls_3", "Pokemon", "Factorio"), selected = "Dark_Souls_3"),
      selectInput("I6","Game You Want to Play Most", choices = c("Ark", "Divinity", "Dark_Souls_1", "Dark_Souls_3", "Pokemon", "Factorio"), selected = "Factorio")
    ),
    
    mainPanel(
      textOutput("txtgame")
    )
  )
)

server <- function(input, output, session) {

re = reactive({
  
  v1 = mean(rnorm(1,1000,100))
  v2 = mean(rnorm(1,1000,100))
  v3 = mean(rnorm(1,1000,100))
  v4 = mean(rnorm(1,1000,100))
  v5 = mean(rnorm(1,1000,100))
  v6 = mean(rnorm(1,1000,100))
  
  x = numeric(36)
  count = 0
  m = c(input$I1, input$I2, input$I3, input$I4, input$I5, input$I6)
  
  vals = c(v1,v2,v3,v4,v5,v6)
  val = sort(vals)
  
  q=0
  
  for(i in 1:6){
    
    for(j in 1:6){
      q = q   1
      if(j == i){
        
        x[q] = 0
      }
      else{
        if(m[i] == m[j]){
          
          x[q] = 1
        }
        else{
          
          x[q] = 0
        }
      }
    }
  }
  
  for(k in 1:36){
    if(x[k] == 0){
      
      count = count   1
    }
    
  }
  if(count == 36){
    chbx = TRUE
  }
  else(
    chbx = FALSE
  )
  
  if(chbx){
    ans = numeric(6)
    
  ans = numeric(6)
for(p in 1:6){

  ans[p] = switch (val[p],
                   v1 = m[1],
                   v2 = m[2],
                   v3 = m[3],
                   v4 = m[4],
                   v5 = m[5],
                   v6 = m[6]
  )
}

    return(ans)
  }
  else{
    ans2 = "You have selected the same game more than once"
    return(ans2)
  }
  
  
})
  
  output$txtgame = renderText(re())
}


shinyApp(ui, server)

 

Итак, это блестящее приложение, которое я разрабатываю для своего друга и меня, но часть переключения доставляет мне проблемы.

Комментарии:

1. Что такое input . Это data.frame?

2. Я думаю, что в этом чего-то не хватает "input$I1" . Вам нужен $ или это созданный вами объект? т.е. Вы создали data.frame как input <- data.frame(I1 = 1, I2 = 2, ... I6 = 6) . Хотя из сообщения не ясно

3. Можете ли вы показать dput m , т.е. dput(m)

4. Возможно, вы создали I1 , I2 , .. I6 как объекты в глобальной среде и пытаетесь получить значение на основе блестящего «ввода». Однако из сообщения неясно

5. Хорошо, подождите, позвольте мне опубликовать весь мой код

Ответ №1:

Если ‘I1’, ‘I2’, …, ‘I6’ являются объектами в глобальной среде

 m <- paste0("I", 1:6)

ans <- numeric(6)
for(p in 1:6) {
        ans[p] <- switch(p, 
           `1` =  get(m[1]), 
           `2` = get(m[2]), 
           `3` = get(m[3]),
           `4` = get(m[4]),
           `5` = get(m[5]),
           `6` = get(m[6])
  }
 

Комментарии:

1. Спасибо за ответ, но, боюсь, это не очень помогает. Входные значения представляют собой текст (строковые значения), которые я хочу отсортировать на основе значений от v1 до v6 в порядке убывания. т.е. строковое значение m[1] привязано к v1, и если v1 <v2, то m[1] помещается под m[2]

2. @Willem.R.Nieuwenhuis можете ли вы обновить свой пост воспроизводимым примером, поскольку я не мог понять, каковы были эти входные значения. Спасибо

3. @Willem.R.Nieuwenhuis Условная операция v1 < v2 , не будет работать, switch поскольку коммутатор проверяет соответствие ключа, а затем возвращает значение для этого ключа

4. Хорошо обновлено, просто заменил вектор m на строку.

5. Я понимаю, но коммутатору не нужно проверять больше или меньше, я заранее сортирую значение.