Разве я не могу использовать функции внутри других функций в R? - PullRequest
0 голосов
/ 11 ноября 2019

У меня возникли проблемы с пониманием функций и сред, поэтому я попытался написать простую функцию, чтобы упростить проблему. Я написал следующий код:

h <- c(1:5)
meta <- function(){
  resta <- function(){
    v <- h-2
    assign("h", v, envir = globalenv())
    h
  }
} 

Теперь, когда я звоню resta(), он берет 2 из h, показывает мне результат и меняет его значение в глобальной среде, но если явызов meta() вообще ничего не происходит, h не меняет своего значения в глобальной среде.

Я также попробовал саму функцию resta (не внутри другой функции), и она работает просто отлично.

Я что-то упустил? Разве R не может запускать такие функции? Есть ли объяснение этому, связанному с окружающей средой?

1 Ответ

0 голосов
/ 11 ноября 2019

Вот способ заставить вашу meta функцию работать:

h <- c(1:5)

meta <- function(){
  resta <- function(){
    v <- h-2
    h <<- v
    v
  }
  resta()
} 

Вам нужно вызвать resta() внутри meta в конце, чтобы сделать его возвращаемым значением.

Кроме того, вместо assign("h", v, envir = globalenv()) вы можете использовать superassignment <<-, который присваивает h в среде meta, если она существует там, прежде чем искать в среде выше - в этом случае она переходит к глобальнойenvironment, т.е.

Hadley Wickham : "<<- никогда не создает переменную в текущей среде, а вместо этого изменяет существующую переменную, найденную в родительской среде. Если<< - не находит существующую переменную, она создаст ее в глобальной среде. "(<strong> Глава 7: Среды, Advanced R )

Убедитесь, что meta() и h имеют одно и то же значение:

Вызов один раз:

meta()
h

> meta()
[1] -1  0  1  2  3
> h
[1] -1  0  1  2  3
> 

Второй звонок:

meta()
h

> meta()
[1] -3 -2 -1  0  1
> h
[1] -3 -2 -1  0  1
> 

И так далее ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...