繁体   English   中英

R 中二进制运算符错误的非数字参数 shiny

[英]non-numeric argument to binary operator error in R shiny

在开发 R-shiny 应用程序时,我遇到了一个关于某些数字输入格式的奇怪问题。 在这个应用程序中,我想动态填充不同选择选项的内容(您首先指定要定义的选项数量,然后应用程序会自动调整输入数量)。 我在 renderUI 中使用了 lapply() 来实现它。 然后我使用输入(数字)来计算一些概率。 它似乎有效,但我仍然收到错误/警告消息:“警告:* 中的错误:二元运算符的非数字参数”。 在计算中,我将 as.numeric() 应用于输入,但它似乎没有什么不同。 您知道可能导致此问题的原因吗? 以及如何解决? 非常感谢您的帮助!

rm(list=ls())
library(shiny)

ui = fluidPage(
  mainPanel(
    sidebarLayout(
      sidebarPanel(
        
        ### select number of options
        numericInput(
          inputId='nbopt',
          label='Number of options',
          value=2,
          min = 2,
          max = 10)),
      
      ### specify content of options
      mainPanel(
        fluidRow(
          column(width=5,
                 h2("Feature 1"),
                 uiOutput("perfx1")),
          column(width=5,
                 h2("Feature 2"),
                 uiOutput("perfx2"))),
        ### Display output table
        tableOutput('pcp_tab'))
      )))


server = function(input, output){
  
  # Define content of options  
  # Feature 1

  output$perfx1 = renderUI({
    lapply(1:input$nbopt, function(j){
      sliderInput(
        inputId=paste0('opt',j,'_x1'),
        label=paste0('Option ',j),
        value=20,
        min = 0,
        max = 40)
    })
  })
  
  # Feature 2

  output$perfx2 = renderUI({
    lapply(1:input$nbopt, function(j){
      sliderInput(
        inputId=paste0('opt',j,'_x2'),
        label=paste0('Option ',j),
        value=15,
        min = 0,
        max = 40)
    })
  })
  
  
  # Compute proba  
  pcp = reactive({
    #
    eu = NULL
    eu = sapply(1:input$nbopt, function(j){
      umove = as.numeric(input[[paste0('opt',j,'_x1')]]) * runif(100,0,1)
      uinfo = as.numeric(input[[paste0('opt',j,'_x2')]]) * runif(100,0,1)
      return(exp(umove + uinfo))})
    
    #
    prb = 100*eu/rowSums(eu)
    
    #
    pcp = NULL
    pcp = data.frame(
      opt =paste0('opt',1:input$nbopt),
      mu  =apply(prb,2,mean),
      se  =apply(prb,2,sd),
      stringsAsFactors=F)
    as.data.frame(pcp)
  })
  
  # Output table

  output$pcp_tab = renderTable({
    pcp()
  })
  
}

shinyApp(ui=ui, server=server)

在开发 R-shiny 应用程序时,我遇到了一个关于某些数字输入格式的奇怪问题。 我使用数字输入来计算一些概率,但收到以下错误/警告消息:“警告:* 中的错误:二元运算符的非数字参数”。

问题是当您启动应用程序时您的sliderInput不存在。 因此,例如input$opt1_x2NULL并且您的reactive pcp中的sapply返回一个list而不是matrix 因此,以下代码行100*eu/rowSums(eu)将引发错误,因为eu是一个list ,而list不是数字参数。 要解决这个问题,您可以添加一个req(input$opt1_x2)以便pcp仅在创建sliderInput之后运行:

  pcp <- reactive({
    req(input$opt1_x2)
    eu <- sapply(1:input$nbopt, function(j) {
      umove <- as.numeric(input[[paste0("opt", j, "_x1")]]) * runif(100, 0, 1)
      uinfo <- as.numeric(input[[paste0("opt", j, "_x2")]]) * runif(100, 0, 1)
      return(exp(umove + uinfo))
    })
    prb <- 100 * eu / rowSums(eu)

    data.frame(
      opt = paste0("opt", 1:input$nbopt),
      mu = apply(prb, 2, mean),
      se = apply(prb, 2, sd),
      stringsAsFactors = F
    )
  })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM