#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. Я понимаю, но коммутатору не нужно проверять больше или меньше, я заранее сортирую значение.