R-Shiny:由胁迫引入的Nas

时间:2018-02-02 14:30:11

标签: r shiny

我刚开始用Shiny。

当我尝试启动代码时,我收到以下错误:

  

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

问题在于功能要求的非数字参数。来自selectImput的id为“Atacante”和“Defensor”的输入在我的函数中没有得到很好的处理。我一直在尝试一些改变但是没有用。如果有人可以帮助我,我会非常感激。 (我为那些怪异的条款道歉)

这是服务器:

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:

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")

)
  )
)

1 个答案:

答案 0 :(得分:0)

首先,您可以将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 <- ...获取之前定义的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)

})