【问题标题】:R-Shiny: Nas introduced by coercionR-Shiny:强制引入的 Nas
【发布时间】:2018-02-02 14:30:11
【问题描述】:

我只是从 Shiny 开始。

我在尝试启动代码时遇到以下错误:

收听http://127.0.0.1:3626 cc 中的警告(input$Atacante, input$Tirada_At, input$Defensor, input$Tirada_Def) : 引入了 NA 通过 cc(input$Atacante, input$Tirada_At, input$Defensor, input$Tirada_Def) : 强制引入的 NAs

问题在于函数所需的非数字参数。来自 ID 为“Atacante”和“Defensor”的 selectImput 的输入在我的函数中没有得到很好的处理。我一直在尝试一些更改,但没有工作。如果有人可以帮助我,我将不胜感激。 (我为这些怪异的条款道歉)

这是服务器:

library(shiny)

server <- function(input, output) {

   damage <- reactive({

    Mob1<- c(40,40,45)
    Mob2<- c(10,10,10)

    cc <- function(Atacante,Tirada_At,Defensor,Tirada_Def){

      Valores_at<-as.numeric(Atacante[1:3])
      Ataque_final<-Valores_at[1]+Tirada_At

      Valores_def<-as.numeric(Defensor[1:3])
      Defensa_final<-Valores_def[2]+Tirada_Def

      res_sin_abs<- (Ataque_final - Defensa_final)
    }

    cc(input$Atacante,input$Tirada_At,input$Defensor,input$Tirada_Def)

  })

  output$dam <- renderTable({
    damage()
  })

}

这是用户界面:

ui <- fluidPage(

  titlePanel("Combate"),

  sidebarLayout(

sidebarPanel(

  sliderInput("Tirada_At", "Tirada atacante:",
              min = -100, max = 200,
              value = 50),


  sliderInput("Tirada_Def", "Tirada Defensor:",
              min = -100, max = 200,
              value = 50),

  selectInput(inputId= "Atacante", label="Atacante:",choices = c("Mob1","Mob2")),
  selectInput(inputId="Defensor", label="Defensor:", choices = c("Mob1","Mob2"))
),

mainPanel(

  tableOutput("dam")

)
  )
)

【问题讨论】:

  • 你的函数在外面工作吗?

标签: r shiny


【解决方案1】:

首先,您可以将 browser() 放入反应式表达式和观察者中,以便像这样调试闪亮的应用程序

 damage <- reactive({

    Mob1<- c(40,40,45)
    Mob2<- c(10,10,10)

    cc <- function(Atacante,Tirada_At,Defensor,Tirada_Def){
      browser()
      Valores_at<-as.numeric(Atacante[1:3])
      Ataque_final<-Valores_at[1]+Tirada_At

      Valores_def<-as.numeric(Defensor[1:3])
      Defensa_final<-Valores_def[2]+Tirada_Def

      res_sin_abs<- (Ataque_final - Defensa_final)
    }

    cc(input$Atacante,input$Tirada_At,input$Defensor,input$Tirada_Def)

  })

现在运行应用程序将为您提供像这样探索输入的当前值的选项。

## Called from: cc(input$Atacante, input$Tirada_At, input$Defensor, input$Tirada_Def)
Browse[1]> Valores_at<-as.numeric(Atacante[1:3])
## Warning: NAs introduced by coercion
Browse[1]> Atacante[1:3]
## [1] "Mob1" NA     NA    
Browse[1]> Atacante
## [1] "Mob1"
Browse[1]> get(Atacante)
## [1] 40 40 45

如您所见,Atacante 是一个长度为 1 的字符向量,用于保存 UI 中的选择。如果要获取之前用Mob1 &lt;- ...定义的vercor,可以使用get

我个人不喜欢在我的项目中使用get,所以这里我将如何编写代码

damage <- reactive({

  mobs <- data.frame(
    Mob1 = c(40, 40, 45),
    Mob2 = c(10, 10, 10)
  )

  cc <- function(Atacante, Tirada_At, Defensor, Tirada_Def){
    Valores_at <- mobs[[Atacante]]
    Ataque_final <- Valores_at[1] + Tirada_At

    Valores_def <- mobs[[Defensor]]
    Defensa_final <- Valores_def[2] + Tirada_Def

    res_sin_abs <- (Ataque_final - Defensa_final)
  }

  cc(input$Atacante, input$Tirada_At, input$Defensor, input$Tirada_Def)

})

【讨论】:

    猜你喜欢
    • 2013-10-15
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2021-06-02
    • 1970-01-01
    • 2015-10-31
    • 2020-02-14
    相关资源
    最近更新 更多