Если я объявить функцию, я могу сослаться на предыдущие аргументы:Путаница аргументы функции в R
blah <- function(a=1, b=a) { print(sprintf("a=%d, b=%d", a, b)) }
Выход:
> blah(10)
[1] "a=10, b=10"
> blah(10, b=30)
[1] "a=10, b=30"
Однако следующий не работает:
> blah(a=10, b=a)
Error in sprintf("a=%d, b=%d", a, b) : object 'a' not found
Фактически, это более или менее то, что вы ожидаете; так почему объявление blah <- function(a=10, b=a)
работает? Почему область здесь различна, чем когда я вызываю функцию?
Кроме того, почему ошибка появляется только при вызове sprintf
? Почему он не вызывает ошибку сразу при вызове функции? Я запутался.
Edit:
Здесь объяснить мое замешательство. Когда я объявляю функцию, параметры не оцениваются. R имеет ленивую оценку, и переменные оцениваются по мере необходимости. Рассмотрим следующее:
> blah <- function(a=1, b=print("foo")) { print("So far, so good") ; print(b) }
>
Не было оценки. Я в настоящее время называют бла:
> blah()
[1] "So far, so good"
[1] "foo"
[1] "foo"
Первое утверждение в функции вычисляется, затемprint("foo")
. Тем не менее, в то время, а есть - мы имеем это в области функций. Так почему бы b=a
не оценить? Мы уже находимся в функции, когда это происходит, а было объявлено.
Edit 2:
Перед тем, как перейти к неправильным выводам, обратите внимание, что ссылаясь на предыдущий аргумент в объявлении функции в R perfectly fine из-за ленивую оценку АиРа. Я не понимаю, почему он работает в объявлении функции, но не тогда, когда я звоню. Я не говорю, что он должен или не должен работать, просто задаваясь вопросом о базовой механике обзора.
У вас нет переменной «a» в вашей среде. Вот почему вы получаете эту ошибку. Например, если вы определяете первый «a = 150», он работает. «a» в вашей функции и «a» в вашей среде - разные объекты. –
Так почему это работает, когда я объявляю функцию? – January
Ну, да, попробуй это для себя. – January