#r #shiny
Вопрос:
Я в замешательстве, почему я получаю Error: invalid argument type
, когда я отрицаю логическое значение input
в server()
функции блестящего приложения. В приведенном ниже минимальном примере input[['log_scale']]
явно является логической (логической) переменной, но оператор if(!input[['log_scale']])
не выполняется. Удаление оператора отрицания !
заставляет код работать, но для моего реального приложения я хочу иметь возможность включать условные операторы, отрицающие некоторые логические значения, передаваемые server()
из input
аргумента.
РЕДАКТИРОВАТЬ: Я попытался следовать предложению YBS использовать ==FALSE
вместо !
. Это все еще вызывает проблемы, если в моем заявлении есть несколько условий if
, разделенных amp;
. См. reprex ниже.
library(shiny)
ui <- fluidPage(
# Application title
titlePanel('Test'),
# Sidebar with options
sidebarLayout(
sidebarPanel(
radioButtons("foo",
"foo",
c('Yes' = TRUE,
'No' = FALSE)),
radioButtons('log_scale',
'Log-transform y-axis?',
c('Yes' = TRUE,
'No' = FALSE)),
),
mainPanel(
plotOutput('plot')
)
)
)
server <- function(input, output) {
output$plot <- renderPlot({
dat <- data.frame(x = 1:5, y = 10^(1:5))
if (input[['foo']] amp; input[['log_scale']] == FALSE) title = "log scale plot" else title = "not log scale plot"
if (input[['log_scale']] == FALSE) z = '' else z = 'y'
plot(dat$x, dat$y, log = z, main = title)
})
}
shinyApp(ui, server)
Комментарии:
1. Возможно, вы можете использовать
if (input[['log_scale']]==FALSE) z = '' else z = 'y'
2. Ага, это работает в reprex, но не работало в моем реальном коде. Я получаю
Error: operations are possible only for numeric, logical or complex types
. Хотя я уверен, что мое входное значение является логичным. Я что-то упускаю? Возможно, мне придется найти лучший репрекс.3. @YBS Я обнаружил, что проблемное поведение возникает, когда
amp;
в оператор if передается несколько условий, разделенных, даже если я использую==FALSE
. Я отредактировал пример, чтобы отразить это.4. Хорошо , я думаю, что решение состоит в том, чтобы использовать
input[['foo']] == TRUE amp; input[['log_scale']] == FALSE
, другими словами, полностью прописать все условия.
Ответ №1:
radioButtons
создает значения типов символов, поэтому приведение типов устраняет проблему.
library(shiny)
ui <- fluidPage(
# Application title
titlePanel('Test'),
# Sidebar with options
sidebarLayout(
sidebarPanel(
radioButtons("foo",
"foo",
c(TRUE = 'yes',
FALSE = 'no')),
radioButtons('log_scale',
'Log-transform y-axis?',
c('Yes' = TRUE,
'No' = FALSE)),
),
mainPanel(
plotOutput('plot')
)
)
)
server <- function(input, output) {
output$plot <- renderPlot({
dat <- data.frame(x = 1:5, y = 10^(1:5))
if (as.logical(input[['foo']]) amp; !as.logical(input[['log_scale']])) title = "log scale plot" else title = "not log scale plot"
if (!as.logical(input[['log_scale']])) z = '' else z = 'y'
plot(dat$x, dat$y, log = z, main = title)
})
}
shinyApp(ui, server)
Комментарии:
1. Ладно, в этом есть большой смысл. Я думаю, что еще лучшим решением было бы использовать флажок для параметров да/нет, чтобы получить логическое значение.