передача переменных и имен в функцию data.table

#r #data.table

#r #data.table

Вопрос:

У меня есть отчет, который необходимо применить для разных имен data.tables [как j, так и by]. Единственный способ сделать это — обернуть аргументы в eval(substitute(value)) функцию. Это делает код менее читаемым. Я назвал аргумент j «переменной», но я хотел бы передать аргумент j функции setnames функциям.

Итак, вопросы:

есть ли способ избежать eval(substitute(value)) построения?

могу ли я передать аргумент j в функцию setnames?

 library(data.table)
library(ggplot2)
data(diamonds, package = "ggplot2")
dt = as.data.table(diamonds)

var.report = function(df, value, by.value) {
  var.report = df[, list( .N,
                    sum(is.finite(eval(substitute(value)))), # count values
                    sum(is.na(eval(substitute(value)))) # count NA
  ), by = eval(substitute(by.value))]

  setnames(var.report, c("variable", "N","n.val","n.NA"))

  return(var.report)
}


var.report(dt, depth, clarity)
  

Ответ №1:

Как насчет eval(substitute ввода всего тела функции (или просто data.table вычисления, если вы хотите быть более конкретным):

 var.report = function(df, value, by.value) {
  eval(substitute({
    var.report = df[, list( .N,
                      sum(is.finite(value)), # count values
                      sum(is.na(value)) # count NA
    ), by = by.value]

    setnames(var.report, c("variable", "N","n.val","n.NA"))

    return(var.report)
  }))
}

var.report(dt, depth, clarity)
#   variable     N n.val n.NA
#1:      SI2  9194  9194    0
#2:      SI1 13065 13065    0
#3:      VS1  8171  8171    0
#4:      VS2 12258 12258    0
#5:     VVS2  5066  5066    0
#6:     VVS1  3655  3655    0
#7:       I1   741   741    0
#8:       IF  1790  1790    0
  

Я не совсем понимаю второй вопрос, и я обычно присваиваю имена в исходном выражении, что помогает лучше отслеживать вещи, например:

 var.report = df[, list(N     = .N,
                       n.val = sum(is.finite(value)), # count values
                       n.NA  = sum(is.na(value)) # count NA
                      )
                , by = list(variable = by.value)]
  

Комментарии:

1. Спасибо! это работает. что касается второго вопроса: «by.value» называется «переменной» в конечном результате. я надеялся, что это имя уже будет названо, поскольку я явно указал имя этой переменной в вызове функции. теперь мне нужно добавить ручные setnames(df, «переменная», «по.value»).