Требуется более сложный подход, если вы хотите, чтобы «имена» переменных проходили точно.
Например, если вы сделаете plot(rnorm(1000),rnorm(1000))
, вы получите хорошие метки на осях X и Y. Другой пример этого - data.frame
> data.frame( rnorm(5), rnorm(5), first=rpois(5,1), second=rbinom(5,1,0.5) )
rnorm.5. rnorm.5..1 first second
1 0.1964190 -0.2949770 0 0
2 0.4750665 0.8849750 1 0
3 -0.7829424 0.4174636 2 0
4 1.6551403 1.3547863 0 1
5 1.4044107 -0.4216046 0 0
Не то, чтобы data.frame присвоил столбцам полезные имена.
Некоторые реализации Curry могут делать это неправильно, что приводит к нечитаемым именам столбцов и меткам графиков. Вместо этого я теперь использую что-то вроде этого:
Curry <- function(FUN, ...) {
.orig = match.call()
.orig[[1]] <- NULL # Remove first item, which matches Curry
.orig[[1]] <- NULL # Remove another item, which matches FUN
function(...) {
.inner = match.call()
.inner[[1]] <- NULL # Remove first item, which matches Curry
do.call(FUN, c(.orig, .inner), envir=parent.frame())
}
}
Это довольно сложно, но я думаю, что это правильно. match.call
будет перехватывать все аргументы, полностью помня, какие выражения определили аргументы (это необходимо для хороших меток). Проблема в том, что он ловит слишком много аргументов - не только ...
, но и FUN
. Он также запоминает имя вызываемой функции (Curry
).
Поэтому мы хотим удалить эти первые две записи в .orig
, чтобы .orig
действительно просто соответствовало ...
аргументам. Вот почему мы делаем .orig[[1]]<-NULL
дважды - каждый раз удаляем запись и сдвигаем все остальное влево.
Это завершает определение, и теперь мы можем сделать следующее, чтобы получить точно так же, как указано выше
Curry(data.frame, rnorm(5), rnorm(5) )( first=rpois(5,1) , second=rbinom(5,1,0.5) )
Последнее замечание по envir=parent.frame()
. Я использовал это, чтобы убедиться, что не возникнет проблем, если у вас есть внешние переменные с именами .inner или .orig. Теперь все переменные оцениваются в том месте, где вызывается карри.