[英]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_x2
是NULL
并且您的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.