【发布时间】:2020-08-16 16:35:54
【问题描述】:
我有以下仅适用于引用变量的函数:
library(data.table) # version 1.11.8
library(purrr)
col_count <- function(dt, vars = NULL){
dt[, .N, by = vars]
}
我已经成功地创建了基本相同的函数,它能够接收带引号和不带引号的变量(感谢 data.table 中的“by”参数,它接收列表或字符向量)。
col_count2 <- function(dt, ...){
vars <- NULL
try(if(is.character(...)) {vars <- unlist(eval(substitute(...)))}, silent = TRUE)
if(is.null(vars)) vars <- substitute(list(...))
dt[, .N, by = vars]
}
dt_iris <- data.table::as.data.table(iris)
identical(col_count2(dt_iris, Petal.Width, Species),
col_count2(dt_iris, c('Petal.Width', 'Species')))
[1] TRUE
现在我希望我的函数能够使用 purrr::map(或 lapply)进行迭代,如下所示:
purrr::map(colnames(dt_iris), ~ col_count(dt_iris, .))
哪个有效。
但是
purrr::map(colnames(dt_iris), ~ col_count2(dt_iris, .))
Error in eval(bysub, x, parent.frame()) : object '.' not found
这是来自 data.table 的消息,它接收 '.'作为 'by =' 表达式中的 vars 变量。 purrr::map 发送 '.'并且因为这不是一个字符,所以它直接指向:
vars <- substitute(list(...))
我猜有更好的方法来解决引用/取消引用问题并保持在data.table 范围内。
【问题讨论】:
标签: r data.table purrr quasiquotes