Tecnologia da Informação
hard

Questão de Tecnologia da Informação #019f69c7

Enunciado da Questão
Tecnologia da Informação
#Programação Funcional
#Linguagem R
#2021
#Escopo Léxico
#Engenharia de Software
#Policial
#Escrivão
#Cebraspe
#PF
Difícil

(Q85) O resultado do código R seguinte será "12".

R
f <- function(x) {
g <- function(y) {
y + z
}
z <- 4
x + g(x)
}
z <- 10
f(4)

A

Certo

B

Errado

Correta

Explicação Oficial / Explicações da Comunidade

Para resolver esta questão, precisamos analisar como a linguagem R gerencia o escopo de variáveis (escopo léxico) e a ordem de execução das instruções.

1. Análise teórica do Escopo Léxico em R:
A linguagem R utiliza escopo léxico (ou escopo estático). Isso significa que a busca por variáveis livres (variáveis que não são argumentos formais nem locais da função) ocorre no ambiente onde a função foi definida, e não de onde ela foi chamada.

No código apresentado:

  • A função g é definida dentro da função f. Portanto, o ambiente de definição de g é o ambiente de execução de f.
  • Dentro de g, a expressão a ser avaliada é y + z. Como z não é um argumento de g e não foi definido localmente dentro de g, ele é uma variável livre.
  • Devido ao escopo léxico, o R procurará o valor de z no ambiente pai de g, que é o ambiente de execução de f.

2. Rastreamento passo a passo da execução de f(4):

  1. A variável global z recebe o valor 10 (z &lt;- 10).
  2. Chamamos a função f passando o parâmetro 4 (f(4)).
  3. No ambiente local da chamada de f:
    • O argumento x assume o valor 4.
    • A função g é definida.
    • A variável local z recebe o valor 4 (z &lt;- 4).
    • A linha x + g(x) é avaliada. Para isso, o R precisa calcular g(4):
      • Na execução de g(4), o argumento y assume o valor 4.
      • Avalia-se y + z. Como z não existe no escopo interno de g, o R busca no ambiente de f (seu escopo pai) e encontra z &lt;- 4.
      • Portanto, g(4) resulta em 4 + 4 = 8.
    • Substituindo de volta na expressão de f: x + g(x) torna-se 4 + 8 = 12.

Conclusão Técnica:
A execução real do código no interpretador R resulta de fato no valor 12. Portanto, a afirmação de que o resultado será "12" está tecnicamente correta.

Nota de Concurso (Por que o gabarito é E?):
A banca examinadora (Cebraspe) considerou o item como Errado devido a uma interpretação equivocada de que a definição da variável z &lt;- 4 ocorrendo após a definição da função g impediria que g enxergasse esse valor, ou por confundir o comportamento com outras linguagens de escopo dinâmico ou de vinculação precoce (early binding). No R, a busca por variáveis ocorre em tempo de execução (lazy evaluation e lexical lookup), garantindo que z seja lido como 4 no momento em que g(x) é de fato chamada. Apesar do erro material da banca, o gabarito oficial foi mantido como Errado.