我很擅长使用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控制台中执行代码时,一切正常。 但是,当我在闪亮的应用程序中使用代码时,应用程序会因“二进制运算符代码的非数字参数”错误而崩溃。
答案 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())
如果你还没有,请给他们一个机会。