Ответ 1
Преимущества определения f2
внутри f1
:
-
f2
отображается только вf1
, полезно, еслиf2
предназначен только для использования внутриf1
, хотя в пространствах имен пакетов это дискуссионно, поскольку вы просто не экспортируетеf2
, если вы определили его вне -
f2
имеет доступ к переменным вf1
, что можно считать хорошим или плохим:- хорошо, потому что вам не нужно передавать переменные через функциональный интерфейс, и вы можете использовать
<<-
для реализации таких вещей, как memoization и т.д. - Плохо, по тем же причинам...
- хорошо, потому что вам не нужно передавать переменные через функциональный интерфейс, и вы можете использовать
Недостатки:
-
f2
необходимо переопределять каждый раз, когда вы вызываетеf1
, что добавляет некоторые накладные расходы (не очень много накладных расходов, но определенно там)
Размер данных не должен иметь значения, так как R не будет копировать данные, если он не изменяется в любом сценарии. Как отмечалось в недостатках, определение f2
вне f1
должно быть немного быстрее, особенно если вы повторяете относительно низкую служебную операцию много раз. Вот пример:
> fun1 <- function(x) {
+ fun2 <- function(x) x
+ fun2(x)
+ }
> fun2a <- function(x) x
> fun3 <- function(x) fun2a(x)
>
> library(microbenchmark)
> microbenchmark(
+ fun1(TRUE), fun3(TRUE)
+ )
Unit: nanoseconds
expr min lq median uq max neval
fun1(TRUE) 656 674.5 728.5 859.5 17394 100
fun3(TRUE) 406 434.5 480.5 563.5 1855 100
В этом случае мы сохраняем 250ns (редактируем: разница на самом деле равна 200ns; верьте, что это или нет дополнительный набор {}
, который fun1
стоит еще 50 нс). Не так много, но может складываться, если внутренняя функция сложнее или вы повторяете функцию много раз.