我试图使用quote / substitute作为一种方法来应用闪亮的条件。我对引用/替代或闪亮都不是很熟悉 - 所以我绝对不能以正确的方式解决这个问题。
我在下面创建了一个简单的例子,说明了我遇到的问题。
#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)
但是这会给出错误&#34;&#34;选择&#34;中的所有子列表必须是名字&#34;)。我不确定如何解释这一点,所以卡住了。我查看了Shiny - All sub-lists in "choices" must be named?中的答案,但没有发现它们有用。
会很感激解决这个问题的方法,或者更好的方法的建议(虽然请注意我不能提前创建子集,因为我的更复杂的实际示例会产生问题)。
答案 0 :(得分:1)
快速解决方法可能是使用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
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)
-output