Tecnologia da Informação
hard

Pregunta de Tecnologia da Informação #019f69c5

Enunciado de la Pregunta
Tecnologia da Informação
#Agente
#Escopo Léxico
#Programação Funcional
#Policial
#2021
#Linguagem R
#PF
#Cebraspe
#Engenharia de Dados
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

Correcto

Explicación Oficial / Explicaciones de la Comunidad

Esta questão exige o conhecimento sobre o escopo de variáveis (scoping rules) na linguagem R, especificamente o escopo léxico (lexical scoping).

Análise Técnica do Código (Passo a Passo)

  1. Definição da função f:
    R
    f <- function(x) {
    g <- function(y) {
    y + z
    }
    z <- 4
    x + g(x)
    }

    Aqui, a função g é definida dentro do ambiente da função f. Portanto, o ambiente pai de g é o ambiente de execução de f.

  2. Definição da variável global z:
    R
    z <- 10

  3. Chamada da função f(4):

    • O parâmetro x assume o valor 4 dentro do ambiente local de f.
    • A função interna g é definida.
    • A variável z é criada no ambiente local de f com o valor 4 (z &lt;- 4).
    • A expressão x + g(x) é avaliada. Como x = 4, temos 4 + g(4).
  4. Execução de g(4):

    • O parâmetro y de g assume o valor 4.
    • A função g tenta retornar y + z (ou seja, 4 + z).
    • Como z não está definido dentro de g, o R utiliza o escopo léxico para buscar o valor de z. Ele procura no ambiente onde g foi definida (que é o ambiente interno de f).
    • No ambiente de f, a variável z existe e vale 4.
    • Portanto, g(4) retorna 4 + 4 = 8.
  5. Resultado final de f(4):

    • Retorna x + g(x) 4 + 8 = 12.

Análise do Gabarito

  • Na execução real do R: O resultado final do código é exatamente 12. Portanto, a afirmação de que "o resultado do código R seguinte será 12" está tecnicamente correta (Certo).
  • Justificativa para o Gabarito Oficial "E" (Errado): A banca examinadora cometeu um equívoco conceitual comum. É provável que o examinador tenha pensado que:
    1. O R buscaria o valor de z no escopo global (z &lt;- 10), o que resultaria em 4 + (4 + 10) = 18.
    2. Ou que, como z &lt;- 4 foi definido depois da declaração de g dentro da função f, o R não encontraria a variável local e buscaria o valor global 10. No R, contudo, a busca de valores ocorre em tempo de execução (lazy evaluation/dynamic lookup), e não de definição, fazendo com que z &lt;- 4 seja perfeitamente visível para g no momento de sua chamada.

Apesar do resultado real do código ser 12 (o que tornaria o item "Certo"), o gabarito oficial mantido pela banca foi E (Errado).