Отклонение логических значений от входных в R

#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. Ладно, в этом есть большой смысл. Я думаю, что еще лучшим решением было бы использовать флажок для параметров да/нет, чтобы получить логическое значение.