Qual é a diferença entre parent.frame () e parent.env () em R; Como eles diferem em chamada por referência?

Seria útil se alguém pudesse ilustrar isso com um exemplo simples?

Além disso, onde seria útil usar parent.frame() vez de parent.env() e vice-versa.

parent.env é o ambiente no qual um fechamento (por exemplo, function) é definido. parent.frame é o ambiente do qual o encerramento foi invocado.

 f = function() c(f=environment(), defined_in=parent.env(environment()), called_from=parent.frame()) g = function() c(g=environment(), f()) 

e depois

 > g() $g  $f  $defined_in  $called_from  

Eu não tenho certeza quando um mero mortal iria realmente querer usá-los, mas os conceitos são úteis para entender o escopo léxico aqui

 > f = function() x > g = function() { x = 2; f() } > h = function() { x = 3; function() x } > x = 1 > f() [1] 1 > g() [1] 1 > h()() [1] 3 

ou no enigmático exemplo de ‘conta bancária’ na Introdução à R. O primeiro parágrafo da seção Detalhes de ?parent.frame pode esclarecer as coisas.

Ambientes são difundidos em R, por exemplo, o caminho search() é (aproximadamente) ambientes encadeados em um relacionamento irmão -> pai. Às vezes, vê-se env = new.env(parent=emptyenv()) para contornar a procura de símbolo – normalmente env[["x"]] procuraria primeiro em env e, em seguida, no pai de env , se não encontrado. Da mesma forma, <<- procura por atribuição começando no parent.env . A relativamente nova implementação de class de referência em R depende dessas idéias para definir um ambiente específico da instância no qual os símbolos (campos e methods da instância) podem ser encontrados.