Во время работы над приложением R-shiny я столкнулся со странной проблемой, связанной с форматированием некоторых числовых входных данных. В этом приложении я хотел бы динамически заполнять содержимое различных вариантов выбора (сначала вы укажете количество параметров, которые хотите определить, а затем приложение автоматически отрегулирует количество входных данных). Я использовал lapply() в renderUI для реализации этого. Затем я использовал входные данные (которые являются числовыми) для вычисления некоторых вероятностей. Кажется, это работает, но я все еще получаю сообщение об ошибке/предупреждении: «Предупреждение: ошибка в *: нечисловой аргумент бинарного оператора». В вычислении я применил 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
, а sapply
внутри вашего reactive
pcp
возвращает 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
)
})
Большое спасибо Стефан! Это работает отлично. Вместо этого я реализовал
req(input[[paste0('opt',input$nbopt,'_x2')]])
. Я заметил, что сообщение об ошибке по-прежнему будет появляться при увеличении количества параметров с 2 (по умолчанию) до 3. Следуя вашему полезному объяснению, я думаю, что это было вызвано тем, что этот 3-й параметр не был определен в начальном (пустом/нулевом) содержимом.