Вот один из способов, которым вы могли бы сделать это, но мне было бы очень неудобно делать это в пакете R, предназначенном для использования другими.Я не знаю, пометит ли это проверка CMD R.
Вы можете увидеть функцию по умолчанию, используемую для поднабора кадров данных, набрав `[.data.frame`
в консоли.Там вы можете увидеть формальные аргументы и тело.Вы увидите, что формальностями по умолчанию являются function (x, i, j, drop = if (missing(i)) TRUE else length(cols) == 1)
.Затем вы можете использовать trace
, чтобы ввести выражение, которое будет оцениваться в начале оценки функции:
create_missing_cols <- function(x, j) {
missing_cols <- setdiff(j, colnames(x))
if (length(missing_cols) > 0L) {
for (column in missing_cols) {
x[[column]] <- NA
}
}
# return
x
}
trace(`[.data.frame`,
print = FALSE,
tracer = quote(x <- create_missing_cols(x, j)))
df <- data.frame(a = 1:2)
df[, c("a", "b", "c")]
a b c
1 1 NA NA
2 2 NA NA
untrace(`[.data.frame`)
Это предполагает, что вы будете использовать его только тогда, когда j
является символьным вектором.
РЕДАКТИРОВАТЬ: если вы в конечном итоге используете это, обязательно рассмотрите возможность использования on.exit(untrace(`[.data.frame`))
сразу после вызова trace
, чтобы функция не отслеживалась даже в случае возникновения ошибок.