Это должно быть действительно базовым, но я совершенно не новичок в определении функций в R.Простейший способ создания функций обертки?
Иногда я хочу определить функцию, которая просто состоит из упаковки базовой функции в одну или несколько других функций.
Например, я написал prop.table2
, который в основном выполняет prop.table(table(...))
.
Сцепка, что я вижу, что я хочу, чтобы моя функция упаковщик принимать необязательные аргументы любого из подфункций и передать их соответствующим образом,
Например,
prop.table2(TABLE,useNA="always",margin=2)=
prop.table(table(TABLE,useNA="always"),margin=2)
Что самый простой способ выполнить что-то вроде этого (предполагая, что нет конфликтов в именах аргументов и т. д.)? Мой базовый подход просто вставить все необязательные аргументы каждой подфункции в основное определение функции, то есть определение: работа
prop.table2<-function(...,exclude=if(useNA=="no")c(NA,NaN),
useNA=c("no","ifany","always"),dnn=list.names(...),
deparse.level=1,margin=NULL)
Давайте из этого примера для конкретности:
dt<-data.table(id=sample(5,size=100,replace=T),
grp=letters[sample(4,size=100,replace=T)])
Я хочу воспроизвести следующее с помощью моей функции:
dt[,prop.table(table(grp,id,useNA="always"),margin=1)]
id
grp 1 2 3 4 5 <NA>
a 0.28571429 0.10714286 0.17857143 0.25000000 0.17857143 0.00000000
b 0.12000000 0.28000000 0.08000000 0.12000000 0.40000000 0.00000000
c 0.23076923 0.23076923 0.15384615 0.19230769 0.19230769 0.00000000
d 0.23809524 0.19047619 0.23809524 0.28571429 0.04761905 0.00000000
<NA>
Адрес: Я сейчас, что все еще не совсем работает; идея заключалась в том, чтобы разделить все на те аргументы, которые принимает prop.table
, а затем передать остальные table
, но я все еще боюсь.
prop.table2<-function(...){
dots<-list(...)
dots2<-dots
dots2[intersect(names(dots2),names(formals(prop.table)))]<-NULL
dots3<-dots2
dots3[intersect(names(dots3),names(formals(table)))]<-NULL
dots2[names(dots2)==""]<-NULL
prop.table(table(dots3,dots2),margin=list(...)$margin)
}
вы можете использовать список и do.call, 'function (..., prop.param = list()) do.call (prop.table, c (table (...), prop.param)) ' – baptiste
Он получил бы compli если подфункции разделяют имена параметров. Вы наиболее безопасно контролируете передачу себя, но вот вопрос, который проверял форматы функции, чтобы увидеть, какие параметры должны пройти: http://stackoverflow.com/questions/25749661/how-to-pass-the-parameters- in-the-parent-function-to-its-two-children-func/25750688 # 25750688 – MrFlick
@baptiste есть опечатка? Это не работает для меня, например: 'dt <-data.table (id = sample (10, size = 100, rep = T), grp = letters [sample (10, size = 100, rep = T)]); dt [, prop.table2 (id, grp, prop.param = list (margin = 1))] ' – MichaelChirico