2015-08-27 1 views
2

В R, когда вы хотите использовать одну или несколько функций внутри другой функции, возможно, есть два пути. Примером функции может быть:Хорошие способы определения функций внутри функции в R

Метод 1:

make.power <- function(n) { 
pow <- function(x) { 
x^n 
} 
pow 
} 

Метод 2:

make.power <- function(n) { 
    pow(n) 
    } 

pow <- function(x) { 
    x^n 
    } 

На мой взгляд (но я не уверен), то второй метод является лучше, если у вас много дочерних функций для родительского.

Мои вопросы: 1) Есть ли функциональные различия между двумя способами? Например, как функция передаст переменные или взаимосвязь между дочерними и родительскими функциями и т. Д.

2) какой из них может быть предпочтительным (возможно, более эффективным для вычисления или структурно ясным) для R?

+2

Вы должны прочитать [эту главу] (http://adv-r.had.co.nz/Functions.html#lexical-scoping) информацию о том, как функционируют функции, когда они определены в других функциях. Кроме того, вопрос 1 немного широк (есть различия - в какой ситуации?), А вопрос 2 частично основан на мнениях. –

+1

Я согласен с @DavidRobinson о широте этого вопроса. Я думаю, что основное различие в ваших методах является очевидным: в методе 1 'pow' является только внутренним для' make.power', тогда как в методе 2 является внешним и, следовательно, доступен для других функций. Что предпочтительнее зависит от контекста: есть ли у вас использование 'pow' вне' make.power'? Является ли это в пакете, где вы можете также включить или не экспортировать 'pow'? – Gregor

+0

На самом деле не получается, почему это слишком широко ... сама концепция широка, но пример, который он дает, имеет ясный пример и очень показателен для ленивой оценки R. –

ответ

3

Если вы спрашиваете о конкретном примере, который вы дали, этот вопрос не кажется слишком широким для меня.

Главное отличие здесь в оценке n. Для пример 1, функция, которая возвращается, по существу имеет жестко закодированное значение n.

> n = 100 
> f1 = make.power(2) 
> f1(2) 
[1] 4 
> n = 1 
> f1(2) 
[1] 4 

Пример 2 не будет, вместо этого он будет опираться на глобальное определение n.

> n = 1 
> make.power2(2) 
[1] 2 
> n = 100 
> make.power2(2) 
[1] 1.267651e+30 

По мере усложнения функций, так же как и задачи обзора. Ссылка Дэвида Робинсона в комментариях - отличный ресурс.

+0

Спасибо, и он очистил мой вопрос. – enaJ

Смежные вопросы