У меня нет expss
под рукой, но я думаю, что в целом речь идет о том, как программно назначать аргументы функции в R.
Если вы начнете с файла CSV, который содержит три пары, которые вам нужны,
csvdat <- read.csv(stringsAsFactors=FALSE, text="
col1,col2,col3
label1,label2,label3")
Я напишу фальшивую функцию (поскольку у меня нет expss
, и это не критично), которая динамически принимает первый аргумент и ноль или более последующих аргументов.
my_fake_labels <- function(x, ...) {
dots <- list(...)
message("x labels : ", paste(sQuote(colnames(x)), collapse = ", "))
message("other names: ", paste(sQuote(names(dots)), collapse = ", "))
}
origDT <- data.table(aa=1, bb=2)
my_fake_labels(origDT, col1="label1", col2="label2", col3="label3")
# x labels : 'aa', 'bb'
# other names: 'col1', 'col2', 'col3'
Это та ручная установка аргументов, которой вы пытаетесь избежать. (Я знаю, что здесь я не устанавливаю метки, давайте пока проигнорируем это.)
Программный c способ сделать это, используя origDT
в качестве первого аргумента, и элементы csvdat
в качестве второго и последующих аргументов:
do.call(my_fake_labels, c(list(origDT), csvdat))
# x labels : 'aa', 'bb'
# other names: 'col1', 'col2', 'col3'
Второй аргумент для do.call
должен быть list
с необязательным именем. Поскольку data.frame
(и, следовательно, data.table
) - это просто прославленное имя list
, это отвечает всем требованиям. Это делает каждый элемент списка и применяет его как соответствующие аргументы функции (первый аргумент do.call
).
list(origDT)
потому, что обычно функция c(...)
объединяет столбцы / элементы двух списков. Если бы мы сделали только c(origDT, csvdat)
, тогда функция вызывалась бы с ncol(origDT) + ncol(csvdat)
аргументами вместо желаемых 1 + ncol(csvdat)
. Для этого c(list(origDT), ...)
проверяет, что весь origDT
является первым аргументом функции.
(Также может быть легко сформировать csvdat
программно вместо того, чтобы требовать внешний файл, но я предполагая, что у вас есть причина сделать это через CSV.)