在 R shiny 中,当使用 tidyverse 包的 tibble 函数时,为什么我的应用程序会崩溃?
In R shiny, when using tibble function of tidyverse package, why does my App crash?
只要服务器部分 v <- reactiveValues(results=tibble(Scenario = 1, data()))
中的行被注释掉,下面的代码就可以正常运行。当我取消注释时,应用程序崩溃并收到错误消息:警告:错误:无法访问反应性消费者之外的反应性值 'input1'。 i 你需要包裹在 reactive() 或 observer() 中吗?
我正在尝试使用 tibble
创建一个向量以添加另一个函数。我在使用 tibble
时做错了什么?我试图通过 tibble
作为向量捕获我的自定义 interpol
函数在通过下面的 data()
函数从矩阵 input2
获取输入时生成的值。我还尝试了 c()
、as.vector()
等,以确保 input2
已转换为向量,但我仍然遇到相同的错误。
我对 tibbles
和 tidyverse
等完全陌生
代码:
library(shiny)
library(shinyMatrix)
library(tidyverse) # < ADDED
interpol <- function(a,b){ # a = periods, b = matrix inputs
c <- rep(NA,a)
c[1] <- b[1]
c[a] <- b[2]
c <- approx(seq_along(c)[!is.na(c)],c[!is.na(c)],seq_along(c))$y # this interpolates
return(c)
}
ui <- fluidPage(
sidebarLayout(
sidebarPanel(uiOutput("panel"),actionButton("showInput2","Modify/add interpolation")),
mainPanel(plotOutput("plot"))
)
)
server <- function(input, output, session){
data <- function(){
if(!isTruthy(input$input1)){interpol(6,matrix(c(1,5)))} else {
if(!isTruthy(input$input2)){interpol(input$periods,
matrix(c(input$input1[1,1],input$input1[1,2])))} else {
interpol(input$periods,matrix(c(input$input2[1,1],input$input2[1,2])))}}
}
# v <- reactiveValues(results=tibble(Scenario = 1, data()))
output$panel <- renderUI({
tagList(
sliderInput('periods','Interpolate over periods (X):',min=2,max=12,value=6),
uiOutput("input1"))
})
output$input1 <- renderUI({
matrixInput("input1",
label = "Interpolation 1 (Y values):",
value = matrix(if(isTruthy(input$input2)){c(input$input2[1],input$input2[2])}
else {c(1,5)}, # matrix values
1, 2, # matrix row/column count
dimnames = list(NULL,c("Start","End"))), # matrix column header
rows = list(names = FALSE), class = "numeric")
})
observeEvent(input$showInput2,{
showModal(
modalDialog(
matrixInput("input2",
label = "Automatically numbered scenarios (input into blank cells to add):",
value = if(isTruthy(input$input2)){input$input2}
else if(isTruthy(input$input1)){input$input1},
rows = list(names = FALSE),
cols = list(extend = TRUE, delta = 2, delete = TRUE, multiheader=TRUE),
class = "numeric"),
footer = modalButton("Close")
))
})
observe({
req(input$input2)
mm <- input$input2
colnames(mm) <- paste(trunc(1:ncol(mm)/2)+1, " (start|end)")
isolate(updateMatrixInput(session, "input2", mm))
})
output$plot<-renderPlot({plot(data(),type="l",xlab="Periods (X)", ylab="Interpolated Y values")})
}
shinyApp(ui, server)
错误原因和解决方案实际上存在于错误消息本身。您不能在反应上下文之外访问 reactive
变量 (data()
)。尝试将 v
输出包装在 reactive
.
中
v <- reactive({tibble(Scenario = 1, data())})
只要服务器部分 v <- reactiveValues(results=tibble(Scenario = 1, data()))
中的行被注释掉,下面的代码就可以正常运行。当我取消注释时,应用程序崩溃并收到错误消息:警告:错误:无法访问反应性消费者之外的反应性值 'input1'。 i 你需要包裹在 reactive() 或 observer() 中吗?
我正在尝试使用 tibble
创建一个向量以添加另一个函数。我在使用 tibble
时做错了什么?我试图通过 tibble
作为向量捕获我的自定义 interpol
函数在通过下面的 data()
函数从矩阵 input2
获取输入时生成的值。我还尝试了 c()
、as.vector()
等,以确保 input2
已转换为向量,但我仍然遇到相同的错误。
我对 tibbles
和 tidyverse
等完全陌生
代码:
library(shiny)
library(shinyMatrix)
library(tidyverse) # < ADDED
interpol <- function(a,b){ # a = periods, b = matrix inputs
c <- rep(NA,a)
c[1] <- b[1]
c[a] <- b[2]
c <- approx(seq_along(c)[!is.na(c)],c[!is.na(c)],seq_along(c))$y # this interpolates
return(c)
}
ui <- fluidPage(
sidebarLayout(
sidebarPanel(uiOutput("panel"),actionButton("showInput2","Modify/add interpolation")),
mainPanel(plotOutput("plot"))
)
)
server <- function(input, output, session){
data <- function(){
if(!isTruthy(input$input1)){interpol(6,matrix(c(1,5)))} else {
if(!isTruthy(input$input2)){interpol(input$periods,
matrix(c(input$input1[1,1],input$input1[1,2])))} else {
interpol(input$periods,matrix(c(input$input2[1,1],input$input2[1,2])))}}
}
# v <- reactiveValues(results=tibble(Scenario = 1, data()))
output$panel <- renderUI({
tagList(
sliderInput('periods','Interpolate over periods (X):',min=2,max=12,value=6),
uiOutput("input1"))
})
output$input1 <- renderUI({
matrixInput("input1",
label = "Interpolation 1 (Y values):",
value = matrix(if(isTruthy(input$input2)){c(input$input2[1],input$input2[2])}
else {c(1,5)}, # matrix values
1, 2, # matrix row/column count
dimnames = list(NULL,c("Start","End"))), # matrix column header
rows = list(names = FALSE), class = "numeric")
})
observeEvent(input$showInput2,{
showModal(
modalDialog(
matrixInput("input2",
label = "Automatically numbered scenarios (input into blank cells to add):",
value = if(isTruthy(input$input2)){input$input2}
else if(isTruthy(input$input1)){input$input1},
rows = list(names = FALSE),
cols = list(extend = TRUE, delta = 2, delete = TRUE, multiheader=TRUE),
class = "numeric"),
footer = modalButton("Close")
))
})
observe({
req(input$input2)
mm <- input$input2
colnames(mm) <- paste(trunc(1:ncol(mm)/2)+1, " (start|end)")
isolate(updateMatrixInput(session, "input2", mm))
})
output$plot<-renderPlot({plot(data(),type="l",xlab="Periods (X)", ylab="Interpolated Y values")})
}
shinyApp(ui, server)
错误原因和解决方案实际上存在于错误消息本身。您不能在反应上下文之外访问 reactive
变量 (data()
)。尝试将 v
输出包装在 reactive
.
v <- reactive({tibble(Scenario = 1, data())})