r - ObserveEvent 中的闪亮应用程序错误?[.default: 无效下标类型“列表”中的错误
问题描述
我正在编写一个闪亮的应用程序,其中一部分包括用户输入文本以模仿 R 代码以及应用程序本身从该输入中挑选某些单词以打印与用户调用的内容相关的向量。但是,当我尝试在应用程序中输入任何单词并按下操作按钮时,它会使程序崩溃并返回错误:Warning: Error in [.default: invalid subscript type 'list',并指示它在观察事件处理程序。事件中有一个列表,但我有一次将其取消列出,因为我无法按照我原本打算的方式使用它,而且我不确定这会如何干扰或使应用程序崩溃。我在下面提供了应用程序代码的相关部分:
library(shiny)
library(stringr)
site <- c(rep("A", 5), rep("B", 5), rep("C", 5), rep("D", 5))
my.num <- 1:20
temp <- rnorm(20, 5, 1)
growth <- 5*temp + rnorm(20, 0, 2)
my.data <- data.frame(site = site, my.num = my.num, temp = temp, growth = growth)
ui <- pageWithSidebar(
headerPanel('Data Wrangler'),
sidebarPanel(
p("It is important to use the right commands to be able to properly format
your data. Let's see what it looks like when we try to use the combine function (c) tp join our variables
instead, for instance:"),
textInput("var.com", "Combine several of the variables using c():", NULL),
actionButton("go6", "GO!")
),
mainPanel(
textOutput("display2")
))
server <- function(input, output, session) {
buttonValue <- reactiveValues(go6=FALSE)
observeEvent(input$go6, {
isolate({
buttonValue$go6 = TRUE
})
games <- names(my.data)
tofind <- paste(games, collapse="|")
cominput <- str_extract_all(input$var.com, tofind)
printables <- NULL
for (i in 1:length(cominput)){
printables[i] <- c(my.data[cominput[i]])
printables
}
working <- unlist(printables)
output$display2 <- renderText(
is.not.null <- function(x) !is.null(x),
if (is.not.null(working)) {
print(working)
} else {
print("Sorry, this is incorrect; check your signage.")
}
)
session$onSessionEnded({
stopApp
})
})
}
shinyApp(ui = ui, server = server)
所有这些都按预期工作,没有包含 Shiny 元素,因此它与 Shiny 反应性有关,不处理其中的某些元素。任何帮助,将不胜感激!
编辑:下面我包含了一些预期输出的屏幕截图,使用了传递给 Shiny 之前的代码。它应该能够获取任何变量名称(“site”、“temp”、“growth”)等,并将它们粉碎在一起并将它们打印为一个长向量,以模拟如果您尝试组合会发生什么他们用 c()。此输出的演示代码如下:
library(stringr)
site <- c(rep("A", 5), rep("B", 5), rep("C", 5), rep("D", 5))
my.num <- 1:20
temp <- rnorm(20, 5, 1)
growth <- 5*temp + rnorm(20, 0, 2)
my.data <- data.frame(site = site, my.num = my.num, temp = temp, growth = growth)
dubbo <- c("temp", "my.num")
games <- names(my.data)
tofind <- paste(games, collapse="|")
secondinput <- str_extract_all(dubbo, tofind)
printables <- NULL
for (i in 1:length(secondinput)){
printables[i] <- c(my.data[secondinput[[i]]])
printables
}
susus <- NULL
susus <- unlist(printables)
susus
解决方案
之后您错过了一些错误处理,str_extract_all
并且您试图以错误的方式访问cominput
(即 a list()
)的元素。
这是否符合您的预期?:
library(shiny)
library(stringr)
site <- c(rep("A", 5), rep("B", 5), rep("C", 5), rep("D", 5))
my.num <- 1:20
temp <- rnorm(20, 5, 1)
growth <- 5 * temp + rnorm(20, 0, 2)
my.data <-
data.frame(
site = site,
my.num = my.num,
temp = temp,
growth = growth
)
ui <- pageWithSidebar(
headerPanel('Data Wrangler'),
sidebarPanel(
p(
"It is important to use the right commands to be able to properly format
your data. Let's see what it looks like when we try to use the combine function (c) tp join our variables
instead, for instance:"
),
textInput("var.com", "Combine several of the variables using c():", NULL),
actionButton("go6", "GO!")
),
mainPanel(textOutput("display2"))
)
server <- function(input, output, session) {
buttonValue <- reactiveValues(go6 = FALSE)
observeEvent(input$go6, {
isolate({
buttonValue$go6 = TRUE
})
games <- names(my.data)
tofind <- paste(games, collapse = "|")
cominput <- str_extract_all(input$var.com, tofind)
printables <- list(NULL)
if (identical(cominput, list(character(0)))) {
working <- NULL
} else {
for (i in 1:length(unlist(cominput))) {
printables[i] <- c(my.data[cominput[[1]][i]])
}
working <- unlist(printables)
}
output$display2 <- renderText(if (!is.null(working)) {
print(working)
} else {
print("Sorry, this is incorrect; check your signage.")
})
session$onSessionEnded({
stopApp
})
})
}
shinyApp(ui = ui, server = server)
推荐阅读
- angular - 说如何在 Angular 中使用 FormArray 实现动态表单
- python - 关于tensorflow GradientDescentOptimizer的一些问题
- java - Spring Batch JdbcPagingItemReader 分页不起作用
- c++ - 如何以静态方式使用另一个 constexpr 数组初始化一个数组
- pandas - 有没有办法使用 Python Pandas 合并基于子列的父列
- php - 如何省略插入 mysql 数据库的 imap 电子邮件附件的编码字符
- java - “org.springframework.web.HttpMediaTypeNotAcceptableException:找不到可接受的表示”以产生 xml 响应
- python - 出现错误:原因:java.net.SocketTimeoutException:接受超时
- python - 将 PostgreSQL 表加载到内存缓存中以在 python/django 中进行 x 维查找
- c# - Windows 模板工作室 - 自定义导航窗格