Функция в data.table с двумя столбцами в качестве аргументов - PullRequest
1 голос
/ 20 марта 2020

У меня есть следующая функция:

DT <- data.table(col1 = 1:4, col2 = c(2:5))

fun <- function(DT, fct){
  DT_out <- DT[,new_col := fct]
  return(DT_out)
}

fun(input, fct = function(x = col1, y = col2){y - x})

В действительности у меня есть некоторая обработка до и после этого фрагмента кода, поэтому я не могу sh напрямую использовать оператор DT[,new_col := fct] с фиксированным fct (потому что fct должен быть гибким). Я знаю, что этот вопрос очень похож на этот один, но я не могу понять, как переформулировать код так, чтобы два столбца в качестве аргументов для функции были разрешены. Код выше дает ошибку:

Error in `[.data.table`(DT, , `:=`(new_col, fct)) : 
  RHS of assignment is not NULL, not an an atomic vector (see ?is.atomic) and not a list column. 

1 Ответ

1 голос
/ 20 марта 2020

Один вариант, если вы не возражаете добавлять кавычки вокруг имен переменных

fun <- function(DT, fun, ...){
  fun_args <- c(...)
  DT[,new_col := do.call(fun, setNames(mget(fun_args), names(fun_args)))]
}

fun(DT, fun = function(x, y){y - x}, x = 'col1', y = 'col2')

DT
#    col1 col2 new_col
# 1:    1    2       1
# 2:    2    3       1
# 3:    3    4       1
# 4:    4    5       1

Или использовать .SDcols (тот же результат, что и выше)

fun <- function(DT, fun, ...){
  fun_args <- c(...)
  DT[, new_col := do.call(fun, setNames(.SD, names(fun_args))), 
     .SDcols = fun_args]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...