2015-06-04 2 views
1

Предположим, у меня есть функция под названием l:Функция: почему эта функция возвращает 20

l <- function(x) x + 1 

затем определить другую функцию, m, но в m, переопределить l:

m <- function() { 
     l <- function(x) x*2 
     l(10) 
} 
m() 

Почему m возвращение x*2, а не x+1?

+0

В данном примере вы вызываете функцию m() и с функцией m() вы вызываете функцию l() R сначала будет искать в среде функций и будет искать среду, в которой она была вызвана, чтобы там была вторая функция выбирается – The6thSense

+0

Перед вызовом функции функция должна быть определена, поэтому функция вызывается после определения функции – The6thSense

ответ

5

Если вы не знаете, что происходит, может быть полезно добавить некоторые заявления печати. Давайте добавим несколько заявлений для печати в код - один, прежде чем m называется, два внутри функции m, и один после m называется:

l <- function(x) x + 1 
m <- function() { 
    print(l) 
    l <- function(x) x * 2 
    print(l) 
    l(10) 
} 
print(l) 
# function(x) x + 1 
m() 
# function(x) x + 1 
# function(x) x * 2 
# <environment: 0x7f8da5ac3b58> 
# [1] 20 
print(l) 
# function(x) x + 1 

Перед m называется и в верхней части m, l является определяется как функция, которая возвращает x+1. Тем не менее, в пределах m вы меняете l на новую функцию, которая возвращает x*2, как указано в заявке на печать в этой функции. В результате вызов l(10) возвращает 20. Наконец, как только вы покинете эту функцию, вы вернетесь к исходному определению l (x+1), потому что версия x*2 определена только для функции. Понятие функции, только определяемой локально, называется name masking.

+0

Хорошая иллюстрация. –

+0

Большое спасибо ... также мог бы уйти от меня, потому что это не так: 0x7f8 ... вывод - это все, я пытаюсь использовать одну и ту же печать и отладочную вещь, и она продолжала появляться вместо значения? –

+0

@VinayakBakshi это означает, что функция определена в 'm', а не в глобальной среде. Если вас интересует более подробная информация о средах в R, есть [отличные ресурсы] (http://adv-r.had.co.nz/Environments.html). – josliber

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

  • Нет связанных вопросов^_^