#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»).