2013-02-25 3 views
0

Я не настолько большой парень из ООП, так что кто-то может объяснить эту простую концепцию в условиях непрофессионала.Как здесь передаются параметры R?

Когда я вызываю foo.child из функции foo.parent, он, кажется, передает аргумент A = 7 в объект foo.child и переопределяет или имеет приоритет над аргументом по умолчанию A = 3 в foo.child как и следовало ожидать.

foo.parent <- function(A=7) foo.child(A) 
foo.child <- function(A=3) 2+A 
foo.parent(A=7) 
#[1] 9 

Но когда я его экземпляр внутри foo.parent, параметр A = 7 действительно проходит вниз или принудительно экземпляра объекта использовать A = 7; вместо этого он использует параметр дочернего объекта A = 3

foo.child<-function(A=3) 2+A 
foo.parent <- function(A=7){ 
    foo.child(A=3) 
} 
foo.parent(A=7) 
#[1] 5 

Почему это происходит? И какую терминологию я бы использовал для описания различий?

+0

'foo.parent <-function (A = 7) {foo.child (A = 3)}' здесь вы перезаписываете 'A' в' foo.parent'. – Roland

ответ

2

Во втором примере вы не указываете значение A (по крайней мере, не так, как вы могли подумать). Попробуйте

foo.child<-function(A=3) 2+A 
foo.parent<-function(A=7){ 
    foo.child(A=A) 
} 
foo.parent(A=7) 
foo.parent() 

вместо этого. Итак, вы смешиваете два разных A с. Знак = в вызове function определяет, что произойдет, если вы не укажете значение для этой переменной в вызове функции.

+0

Я читал чужой код, где они всегда, кажется, вынуждают аргумент по умолчанию в дочерних функциях (т. Е. Foo.child (A = 3)). Когда я создаю экземпляр этого объекта, я ожидаю, что он автоматически переопределит значение в дочернем блоке. Было бы правильным сказать, что вы должны оставить аргумент пустым или неопределенным при создании экземпляра (т. Е. A = A). –

+0

Я имею в виду, у вас есть просто две независимые функции. 'foo.child' и' foo.parent' не используют ничего, кроме тех же имен переменных аргументов, но их также можно назвать по-другому. Это может вызвать путаницу. –

2

Я думаю, что ваша проблема заключается в том, что вы не совсем понимаете, как работают аргументы по умолчанию. Так

foo.child = function(A=1) 2+A 

определяет функцию foo.child, которая имеет значение параметра по умолчанию A=1. Так,

foo.child() 

дает 3. В настоящее время в этой функции

foo.parent = function(A=3){ 
    foo.child(A=4) 
} 

вы всегда передавая значение A=4 функции foo.child, следовательно,

foo.parent(A=7) 
# 6 

Кроме того, когда вы пытаются выяснить, что происходит, полезно иметь разные значения A

+0

, так что если у меня есть библиотека с установленными аргументами по умолчанию ... т.е. Я беру foo.child (A = 4) из чьей-то библиотеки и создаю экземпляр объекта, я должен изменить переменную внутри этого значения по умолчанию от A = 4 до A = A каждый раз, когда я его создаю. Верный? –

+0

Я думаю, что вы смешиваете концепции и немного путаетесь в этом процессе. Для начала просто подумайте о функции foo.child как функции. Он принимает некоторые данные и что-то возвращает. Если вы ничего не передадите, то оно будет использовать значение по умолчанию (Proviso: Я знаю, что функции являются объектами первого класса). – csgillespie

+0

между двумя ответами, которые я получил сейчас. Благодаря! Я бы проголосовал, если мог. –

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