在闪亮的应用程序中使用 quote() 和 substitute() 作为条件
Using quote() and substitute() for conditions within a shiny app
我正在尝试使用 quote/substitute 作为在 shiny 中应用条件的方法。我对 quote/substitute 或 shiny 都不是很熟悉 - 所以我绝对有可能没有以正确的方式解决这个问题。
我在下面创建了一个简单示例来说明我遇到的问题。
#Create test dataframe
test<-data.frame(x=c(0:10), y=c(rep(1,5),rep(2,6)), z=c("A","A","A","B","B","B","C","C","C","C","C"))
#example of what I would like to do outside shiny app
test[test$x > 5,]
#or using quote and eval
test[eval(quote(test$x > 5)),]
以上所有代码都有效。但是现在假设我想在一个闪亮的应用程序中应用它(并允许用户选择条件):
#create simple shiny app
require(shiny)
# Server
server <- function(input, output) {
# subset of nodes
df <- reactive({
#eliminate certain observations
x <- test[eval(input$condition),]
})
output$table <- renderTable({
df <- df()
})
}
# UI
ui <- fluidPage(
radioButtons("conditon", "Condition", choices = c("cond_1" = substitute(test$x > 5), "cond_2" = substitute(test$x<5))),
tableOutput("table")
)
# Create app
shinyApp(ui = ui, server = server)
但这会给出错误 "All sub-lists in "choices" must be names")。我不确定如何解释这一点,所以被困住了。我查看了 Shiny - All sub-lists in "choices" must be named? 中的答案,但没有发现它们有帮助。
希望有解决此问题的方法或更好方法的建议(但请注意,我无法提前创建子集,因为对于我更复杂的实际示例,这会产生问题)。
一个 quick 修复可能是用 deparse
换行然后使用 eval(parse
。尚不完全清楚为什么输入需要是表达式。如果这只是为了子集化,有更简单的方法来完成同样的事情
library(shiny)
-ui
ui <- fluidPage(
radioButtons("conditon", "Condition",
choices = list(cond_1 = deparse(substitute(test$x > 5)),
cond_2 = deparse(substitute(test$x<5))),
selected = deparse(substitute(test$x > 5)) ),
tableOutput("table")
)
-服务器
server <- function(input, output) {
# subset of nodes
df <- reactive({
#eliminate certain observations
test[eval(parse(text=input$conditon)),, drop = FALSE]
})
output$table <- renderTable({
df()
})
}
-创建应用程序
shinyApp(ui = ui, server = server)
-输出
我正在尝试使用 quote/substitute 作为在 shiny 中应用条件的方法。我对 quote/substitute 或 shiny 都不是很熟悉 - 所以我绝对有可能没有以正确的方式解决这个问题。
我在下面创建了一个简单示例来说明我遇到的问题。
#Create test dataframe
test<-data.frame(x=c(0:10), y=c(rep(1,5),rep(2,6)), z=c("A","A","A","B","B","B","C","C","C","C","C"))
#example of what I would like to do outside shiny app
test[test$x > 5,]
#or using quote and eval
test[eval(quote(test$x > 5)),]
以上所有代码都有效。但是现在假设我想在一个闪亮的应用程序中应用它(并允许用户选择条件):
#create simple shiny app
require(shiny)
# Server
server <- function(input, output) {
# subset of nodes
df <- reactive({
#eliminate certain observations
x <- test[eval(input$condition),]
})
output$table <- renderTable({
df <- df()
})
}
# UI
ui <- fluidPage(
radioButtons("conditon", "Condition", choices = c("cond_1" = substitute(test$x > 5), "cond_2" = substitute(test$x<5))),
tableOutput("table")
)
# Create app
shinyApp(ui = ui, server = server)
但这会给出错误 "All sub-lists in "choices" must be names")。我不确定如何解释这一点,所以被困住了。我查看了 Shiny - All sub-lists in "choices" must be named? 中的答案,但没有发现它们有帮助。
希望有解决此问题的方法或更好方法的建议(但请注意,我无法提前创建子集,因为对于我更复杂的实际示例,这会产生问题)。
一个 quick 修复可能是用 deparse
换行然后使用 eval(parse
。尚不完全清楚为什么输入需要是表达式。如果这只是为了子集化,有更简单的方法来完成同样的事情
library(shiny)
-ui
ui <- fluidPage(
radioButtons("conditon", "Condition",
choices = list(cond_1 = deparse(substitute(test$x > 5)),
cond_2 = deparse(substitute(test$x<5))),
selected = deparse(substitute(test$x > 5)) ),
tableOutput("table")
)
-服务器
server <- function(input, output) {
# subset of nodes
df <- reactive({
#eliminate certain observations
test[eval(parse(text=input$conditon)),, drop = FALSE]
})
output$table <- renderTable({
df()
})
}
-创建应用程序
shinyApp(ui = ui, server = server)
-输出