Dynamic 根据动态用户输入对数据进行子集设置或过滤

Dynamic 根据动态用户输入对数据进行子集设置或过滤,dynamic,dataframe,shiny,dplyr,Dynamic,Dataframe,Shiny,Dplyr,我喜欢根据动态用户输入过滤数据。下面提到的示例代码是可执行的,但是,目前它没有过滤数据的逻辑。因此,无论选择何种变量,该表都不会改变。代码主要有三个部分:1。前几行代码创建了一个数据帧,其中的信息可用于动态创建控件小部件;2. 用户界面代码;3. server目前具有动态创建控件小部件的逻辑,我需要弄清楚如何使用动态创建的控件小部件中的信息并过滤数据(用于不同的目的)。我不知道如何跟踪变量的数量并根据它们的范围进行过滤。非常感谢您的建议 ## Create a data frame of whi

我喜欢根据动态用户输入过滤数据。下面提到的示例代码是可执行的,但是,目前它没有过滤数据的逻辑。因此,无论选择何种变量,该表都不会改变。
代码主要有三个部分:1。前几行代码创建了一个数据帧,其中的信息可用于动态创建控件小部件;2. <代码>用户界面代码;3.
server
目前具有动态创建控件小部件的逻辑,我需要弄清楚如何使用动态创建的控件小部件中的信息并过滤数据(用于不同的目的)。我不知道如何跟踪变量的数量并根据它们的范围进行过滤。非常感谢您的建议

## Create a data frame of which information is used in creating (dynamical) control widgets
varnames <- names(iris[,1:4]) # names
varinit <- apply(iris[,1:4],2,median) # initival value used in slider
varmin <- apply(iris[,1:4],2,min) # min.
varmax <- apply(iris[,1:4],2,max) # max. 

## dataframe
vardf <- data.frame(varnames,varmin,varmax,varinit)

ui <- fluidPage(
   checkboxGroupInput("ConditioningVariables", "Conditioning variables (choose one or more):",
                      varnames,inline = TRUE),
uiOutput("ControlWidgetsofConditioningVariables"),
   tableOutput("data")
)

server <- function(input, output, session) {

   output$ControlWidgetsofConditioningVariables <- renderUI({
      if (is.null(input$ConditioningVariables)){
         return() 
      } else {
         selvarnames = sort(input$ConditioningVariables)
         selpos = sapply(selvarnames,function(x) which(varnames==x))
         # create a taglist of dynamic widgets
         ListofDynamicWidgets <- lapply(selpos, function(x){sliderInput(as.character(vardf[x,1]),
                                                          as.character(vardf[x,1]),
                                                          vardf[x,2],vardf[x,3],
                                                          vardf[x,4],.1)})
         do.call(tagList, ListofDynamicWidgets)
      }
   })
   ## filter data as per selected variables and their range
   ## this is where I'm kind of struck, I think I need to track number of variables (is list good idea?)
   ## and filter as per selected range of a specific variable
   newdata <- reactive({
      subset(iris)
   })
   output$data <- renderTable({ newdata() })
   }
shinyApp(ui, server)
##创建一个数据框,其中的信息用于创建(动态)控件小部件
varnames这里有一种方法(注意,我稍微修改了代码以生成小部件)。其主要思想是生成范围向量的命名列表(
conds
),将范围转换为表示过滤条件的字符串列表(
subs
),将其折叠为一个长条件字符串,并将其用作
filter\uz()
的子集参数

库(dplyr)

服务器很高兴知道不必使用
tagList
来生成小部件。过滤数据-非常巧妙地使用看似简单的命令。太棒了。有没有直接给出符合标准的行位置(或数字)的命令?通常,我将所有行号保存在一个单独的列中,并从该特定列中计算行号;但这里有一个方法的例子:
with(iris),它(eval(parse(text=“Sepal.Length>=5&Sepal.Length@Weihuang Wong)要求您提供以下信息:1.我了解
input[[x]]
提取元素
x
范围,但不确定如何在服务器外部调用此函数。R.我在global.R中尝试将数据过滤算法作为一个单独的函数,当我运行它时,它给了我一个错误对象
输入
未找到。2.无法访问此特定行
subs请打开一个包含说明的新问题用一个最小的可重复的例子来解决你的问题。这样你也可以从其他人那里得到帮助。
library(dplyr)
server <- function(input, output, session) {
  allControls <- lapply(setNames(varnames, varnames), function(x) {
    sliderInput(x, x, varmin[x], varmax[x], c(varmin[x], varinit[x]), 
      round = -2)
  })
  output$ControlWidgetsofConditioningVariables <- renderUI({    
    if (is.null(input$ConditioningVariables)){
      return() 
    } else {
      allControls[input$ConditioningVariables]
    }
  })
  ## filter data as per selected variables and their range
  newdata <- reactive({
    if(!is.null(input$ConditioningVariables)) {
      cond_names <- input$ConditioningVariables
      conds <- lapply(setNames(cond_names, cond_names), function(x) input[[x]])
      subs <- mapply(function(name, range){
        if (!is.null(range))
          sprintf("%1$s >= %2$f & %1$s <= %3$f", name, range[1], range[2])
      }, names(conds), conds)
      subs <- subs[!sapply(subs, is.null)]
      if (length(subs) > 0)
        filter_(iris, paste0(subs, collapse = " & "))    
      } else {
        iris
      }
    })
  output$data <- renderTable({ newdata() })
}