访问带引号的圆点参数的名称 数据

问题描述

我有两个功能

exclude <- function(df,...) {
  dots <- rlang::enquos(...)
  for(i in 1:length(dots)) {
    df <- exclude_cycle(df,dots[[i]])
  }
  return(df)
}

exclude_cycle <- function(df,condition) {
  df <- dplyr::filter(df,!!condition)
  print(paste(nrow(df),"records left after excluding",eval(condition),sep = " "))
  return(df)
}

我希望print(paste(nrow(df),sep = " "))打印一个看起来像100000 records left after excluded age > 18的简单字符串,其中age > 18是我直接传递给exclude函数的过滤器:

exclude(df,age > 18)

我最终得到的输出类似于:

[1] "100000 records left after excluding ~"         "100000 patients left after excluding age >= 18"

这与我想要的非常接近,但是每个字符向量打印两个字符串而不是1。如何获得所需的输出

解决方法

您可以使用rlang::enexprs允许在单个函数中将多个条件传递给点。另外,如果要排除条件,请记住要反转过滤器:

exclude <- function(df,...) {
  dots <- rlang::enexprs(...)
  for(i in seq_along(dots)){
    df <-  dplyr::filter(df,!(!!(dots[[i]])))
    cat(nrow(df),"records left after excluding",as.character(dots[i]),"\n")
  }
}

例如:

df <- data.frame(letters = rep(LETTERS[1:3],10),numbers = 1:30)

exclude(df,letters == "A",numbers < 15)
#> 20 records left after excluding letters == "A" 
#> 11 records left after excluding numbers < 15 
,

这是一个选择

exclude_cycle <- function(df,condition) {
  df <- dplyr::filter(df,!!condition)
  print(paste(nrow(df),as.list(eval(condition))[-1],sep = " "))
  return(df)

}

-测试

exclude(df,age > 18)
#[1] "2 records left after excluding age > 18"
#  age
#1  42
#2  19

数据

df <- data.frame(age = c(42,19,3))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...