r - 如何计算 R quosure 中的变量数?
问题描述
假设我有一个函数,它使用非标准评估 (NSE) 接收数据帧和来自该数据帧的不同数量的变量。是否有比选择()这些变量并计算列数更快/更直接的方法来计算提供的变量的数量?
# Works but seems non-ideal
nvar <- function(df, vars) {
vars_en <- rlang::enquo(vars)
df_sub <- dplyr::select(df, !!vars_en)
ncol(df_sub)
}
nvar(mtcars, mpg:hp)
#> 4
解决方案
高度怀疑(我意识到这可能会收到反对票) - 我认为最明智的选择是像这样简单地从 data.frame 的 colnames 中选择 - 使用tidyselect::vars_select
nvar1 <- function(df, vars) {
vars_en <- rlang::enquo(vars)
ans <- vars_select(names(df), !! vars_en)
length(ans)
}
但即使这样也比select(df) %>% ncol
library(microbenchmark)
library(nycflights13)
library(tidyselect)
nvar <- function(df, vars) {
vars_en <- rlang::enquo(vars)
df_sub <- dplyr::select(df, !!vars_en)
ncol(df_sub)
}
identical(nvar(nycflights13::flights, day:sched_arr_time), nvar1(nycflights13::flights, day:sched_arr_time))
# TRUE
microbenchmark(nvar(nycflights13::flights, day:sched_arr_time), nvar1(nycflights13::flights, day:sched_arr_time), unit='relative', times=100L)
# Unit: relative
# expr min lq mean median uq max neval
# nvar(nycflights13::flights, day:sched_arr_time) 1.000000 1.000000 1.00000 1.000000 1.000000 1.0000000 100
# nvar1(nycflights13::flights, day:sched_arr_time) 1.685793 1.680676 1.60114 1.688626 1.660196 0.9878235 100
推荐阅读
- node.js - TypeORM 选择所有行但限制为 25
- c# - 如何过滤 IList 子查询 EF Core 2.2
- python-3.x - 如何在python中使用异步io(快速方式)将数据从一个s3存储桶复制到另一个存储桶?
- r - R中的非线性优化 - 非线性约束
- json - 使用角度解析 Json 响应
- windows - 如何使用 CMD 显示没有父路径的纯文件名
- google-app-engine - 对 gcloud 计算区域的查询描述 us-central1 --flatten='quotas[]' --format='csv[no-heading](quotas.metric,quotas.limit,quotas.usage)'
- javascript - 如何在不重新加载页面的情况下手动设置“this.props.history.location.pathname”的值?
- javascript - jQuery 在 .each 中创建变量引用
- node.js - 虚拟助手机器人框架和控制库