R - Shiny Package - 二元运算符的非数字参数

时间:2015-06-02 15:13:00

标签: r shiny

我很擅长使用R而我只是用Shiny软件包测试一些东西。在我的应用程序中,我请求用户提供一些输入,根据这些输入,应用程序必须进行一些计算。

以下列方式(ui.R代码)

向用户询问输入
library(shiny)
shinyUI(fluidPage(
      titlePanel("Shiny Test application"),
      # The layout
      fixedRow(
        column(9,
           radioButtons("data",label = "Data", list("Onbelangrijk", "Minder belangrijk", "Neutraal", "Belangrijk", "Zeer belangrijk"), "", inline = TRUE),
           radioButtons("visualisatie",label = "Visualisation", list("Onbelangrijk", "Minder belangrijk", "Neutraal", "Belangrijk", "Zeer belangrijk"), "", inline = TRUE),
           radioButtons("price",label = "Price", list("Onbelangrijk", "Minder belangrijk", "Neutraal", "Belangrijk", "Zeer belangrijk"), "", inline = TRUE),
           radioButtons("self",label = "Self-service", list("Onbelangrijk", "Minder belangrijk", "Neutraal", "Belangrijk", "Zeer belangrijk"), "", inline = TRUE),

下面代表我的server.R代码。

示例如何生成输入值:

     data <- reactive({
      if(input$data == "Onbelangrijk") {
        data <- 1
      } else if (input$data == "Minder belangrijk") {
        data <- 3
      } else if (input$data == "Neutraal") {
        data <- 5
      } else if (input$data == "Belangrijk") {
        data <- 7
      } else {
        data <- 9
      } })

visualisatie <- reactive({
    if(input$visualisatie == "Onbelangrijk") {
      visualisatie <- 1
    } else if (input$visualisatie == "Minder belangrijk") {
      visualisatie <- 3
    } else if (input$visualisatie == "Neutraal") {
      visualisatie <- 5
    } else if (input$visualisatie == "Belangrijk") {
      visualisatie <- 7
    } else {
      visualisatie <- 9
    } })

价格和自我的价值以同样的方式得出。

将此输入放入向量:

criteria <- c(data, visualisatie, price, self)

生成所需的矩阵以使用AHP公式:

  MATR <- matrix(criteria, nrow = 4, ncol = 4)
  MATR2 <- t(t(MATR)/criteria)

这会导致以下错误消息:

Error in t(MATR)/criteria : non-numeric argument to binary operator

我认为错误是因为之前创建的向量。 我已经尝试使用以下功能:

criteria <- as.numeric(criteria)

criteria <- as.numeric(unlist(criteria))

但是那些导致了以下错误:

(list) object cannot be coerced to type 'double'

另一个奇怪的事情是,当我在R控制台中执行代码时,一切正常。 但是,当我在闪亮的应用程序中使用代码时,应用程序会因“二进制运算符代码的非数字参数”错误而崩溃。

2 个答案:

答案 0 :(得分:1)

使用reactive时,需要将生成的机箱作为函数调用。见?reactive。而是使用:

data <- c(data(), visualisatie(), price(), self())

顺便说一句:有一些整洁的(如#34;干净的代码&#34;)进行转换的方法:

data <- reactive({
    switch(input$data,
           "Onbelangrijk" = 1,
           "Minder belangrijk" = 3,
           "Neutraal" = 5,
           "Belangrijk" = 7,
           9)
    })
## repeat for the other three

或者甚至可能更改 的反应意见:

MATR <- reactive({
    likert <- function(x) {
        switch(x,
               "Onbelangrijk" = 1,
               "Minder belangrijk" = 3,
               "Neutraal" = 5,
               "Belangrijk" = 7,
               9)
        }
    data <- likert(input$data)
    visualisatie <- likert(input$visualisatie)
    price <- likert(input$price)
    self <- likert(input$self)
    criteria <- c(data, visualisatie, price, self)
    m <- matrix(criteria, nrow=4, ncol=4)
    m / t(m)
})

我不是一个闪亮的忍者,所以有可能有更好的方法来定义一个可以在反应结构中使用的函数,而不是每次都重新定义它(叹气)。

如果您在其他地方需要criteria,则可能应该是反应组件,而不是MATR。给你。

答案 1 :(得分:0)

您是否已经介入并确保在完成反应式表达后获得正确的数据?

因为你生成的变量都使用了反应式表达式,所以它们实际上也是Shiny中的函数。因此,当您使用if语句时,在所有语句结束时,您必须返回变量以将其保存到对象中。因为你没有这样做,我认为发生的事情是你没有标准中的任何数据,它只是一个NA或NULL的向量。像

这样的东西
data <- reactive({
      if(input$data == "Onbelangrijk") {
        data <- 1
      } else if (input$data == "Minder belangrijk") {
        data <- 3
      } else if (input$data == "Neutraal") {
        data <- 5
      } else if (input$data == "Belangrijk") {
        data <- 7
      } else {
        data <- 9
      } 
    data
})

另外,你在哪里创建矩阵?它是在server.R脚本中的另一个函数内吗?通常,因为这些变量被视为函数,当你稍后调用它们将它们分配给向量或类似的东西时,你必须像它们一样调用它们,例如: criteria<-c(data(),visualisatie(), price(), self())

如果你还没有,请给他们一个机会。