У меня есть следующая функция, которая работает только для переменных в кавычках:
library(data.table) # version 1.11.8
library(purrr)
col_count <- function(dt, vars = NULL){
dt[, .N, by = vars]
}
Я успешно создал в основном одну и ту же функцию, которая способна принимать переменные как в кавычках, так и без кавычек (благодаря аргументу 'by' в data.table, который получает список или символьный вектор).
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, которое получает '.' в качестве переменной vars в выражении «by =». purrr :: map отправляет '.' и так как это не символ, он идет прямо к:
vars <- substitute(list(...))
Я предполагаю, что есть лучший способ решить проблему с кавычками / кавычками и оставаться в пределах data.table
.