Escopo Léxico e Lazy-evaluation no R

Como já falei aqui, vou dar um curso de R, e começa na semana que vem. Estou analisando o material que já tenho pronto e percebi que não tenho nada muito estruturado sobre escopo e lazy-evaluation no R. Acho que isso é importante e estou inclinado a gastar algumas horas do curso falando sobre o tema. Então, o que segue são algumas anotações não estruturadas, para mim mesmo, mas que eventualmente podem ser úteis para outras pessoas.

Segundo a wikipedia, o escopo é “um contexto delimitante aos quais valores e expressões estão associados”. Em outras palavras, quando fazemos um programa, o escopo determina o que faz parte daquele contexto e o que não faz parte. Por exemplo, quando pedimos para o computados avaliar x + 5, precisamos de regras que definam onde acharmos o valor de x. Essas regras definem como é formado o escopo da linguagem. Na prática, isso é importante para evitar, por exemplo, que variáveis com o mesmo nome em contextos diferentes gerem conflitos na execução do programa da parte do computador. E por isso é importante que o programador conheça como funciona o escopo da linguagem em que ele está trabalhando. Aqui nós temos um paper dos criadores do R sobre o escopo da linguagem.

Algumas definições devem ser introduzidas, para que possamos entender como funciona o escopo no R. Vou introduzir as definições a partir de um exemplo do paper citado acima. Considerem a função abaixo.

f <- function(x) {
y <- 2 * x 
print(x)
print(y)
print(z)
}

Na função acima, x é um argumento da função ou parâmetro formal da função, y é uma variável local (pois é criada e definida no interior da função) e z é uma variável livre (não é criada no interior da função). Quando formos rodar (avaliar) essa função, precisamos passar o argumento da função, por exemplo, f(10). A função então sabe que y é 20 e pode imprimir o valor de x e de y, mas não de z. O que as regras de escopo devem determinar é onde a função deve olhar para determinar quanto é x, y e z.  Se z não tiver sido definido fora da função no ambiente global, o R não conseguirá determinar o seu valor e, portanto, retornará o erro. Se vocês rodarem f(10), verão que o R imprime o valor de x, de y e retorna um erro para z. Se, por outro lado, criarmos uma outra função, g, definida abaixo, e rodarmos g(10), o R retornará apenas um erro.

g <- function(x) {
y <- 2 * x 
print(z)
print(y)
print(x)
}

Em computação, nós dizemos que o R tem lazy-evaluation, e não strict evaluation. Ou seja, o R só tenta executar um comando no momento em que ele é chamado. Ele vai executando a função sequencialmente e checando se encontra os valores necessários enquanto executa o código.  Assim, uma função como a do código abaixo pode funcionar perfeitamente em R:

h <- function (x) {
  y <- 3*abs(x) + 1
  if (y < x) {
    z <- minha_funcao_nao_definida_em_lugar_algum()  
  }
  return(y)
}

Como y nunca será menor do que x, o que está dentro do if nunca é avaliado, e a função não retorna um erro. Essa é uma lição importante, porque se o que queremos executar dentro de um if estiver errado, mas a condição do if for verdadeira apenas em algumas condições, podemos testar nossa função e nunca ver um erro, e no entanto encontrarmos algum erro numa utilização em produção.

Retornando ao escopo. Esse post discute as diferenças conceituais entre escopo dinâmico e escopo léxico (que é o default do R). Eu não vou entrar aqui nas minúcias conceituais das definições, mas vocês podem ler o post se tiverem interesse no tema. Mais interessante para entender a diferença entre os dois tipos de escopo é o exemplo do post, que reproduzo abaixo.

a=1
b=2
f<-function(x)
{
  a*x + b
}
g<-function(x)
{
  a=2
  b=1
  f(x)
}
g(2)

Leia o código e me diga, qual a resposta para g(2)? A resposta eu dou logo abaixo, mas deve ser óbvio (se você entendeu o código minimamente) que g(2) deve retornar 4 ou 5. No escopo dinâmico, g(2) retornaria 5, num escopo léxico, retornaria 4 (que é o do R). A razão para tal é que no escopo léxico, o escopo de uma função é definido pelo ambiente em que ela foi criada. A função f foi criada no ambiente global e, portanto, as variáveis livres ‘a’ e ‘b’ terão seus valores determinados globalmente (que é o ambiente onde f foi criada). Numa linguagem de escopo dinâmico, o que importa é onde a função está sendo chamada. Nesse caso, as variáveis livres teriam seus valores determinados primeiramente localmente, dentro de g e, apenas caso não existissem esses valores em g, procuraríamos no ambiente global. Vale notar, ainda, que se a f tivesse sido criada localmente em g, então g(2) retornaria 5.

As coisas começam, porém, a complicar quando temos uma f definida globalmente e uma f definida localmente. Vejam o código abaixo:

f<-function(x)
{
  a*x + b
}
 
g<-function(x)
{
  a=1
  b=2
  f<-function(x)
  {
    b*x + a
  }
  f(x)
}
g(2)

Nós temos uma f definida globalmente e uma f definida localmente. Quando chamarmos g, qual função ‘f’ o R executará? Meu entendimento é que, do mesmo jeito que definimos variáveis locais e livres, podemos pensar nas funções como sendo locais ou livres (também podem ser argumentos, mas deixemos isso de lado por ora). No exemplo acima, a f é definida localmente, e portanto não há necessidade de procurar em outro ambiente a f. No exemplo anterior, a f era uma função livre e, portanto, o R procurava no ambiente global pela função f.

Se é verdade que nós conseguimos entender como o R opera seguindo suas regras de escopo, nem sempre isso funciona. Os problemas de escopo no R foram ilustrados muito bem, eu acho, pelo Christian Robert no blog dele há algum tempo. Considere o código abaixo:

f <- function() {
if (runif(1) > .5)
x <-  10
x
}

O valor de x é aleatoriamente local e global! Se a condição do if for verdadeira, x recebe 10, se não, x é o que quer que esteja definido globalmente! Se x não estiver definido globalmente, é possível tanto obter um erro “error in f() : object ‘x’ not found” como o valor 10.

Pra terminar esse post. Se você realmente entendeu o que eu escrevi, então deveria ser capaz de responder às perguntas 2 e 5 desse quiz feito pelo Hadley (do pacotge ggplo2).

Publicado em Política e Economia | Deixe um comentário

Declaração de posição

Plagiando a galera, eis algumas posições minhas:

Maradona maior (mas não melhor) que Pelé.
Foi a Copa das Copas
Um dos principais problemas do futebol brasileiro é o gramado (a bola corre muito mais lenta)
Detesto jogador burro
A verdade é mais importante que a felicidade
O Império contra-ataca é o melhor episódio
O que o Bill Maurray diz pra Scarlet Johansson em lost in translation é o mistério mais importante do Cinema recente.
Caetano >>>>> Chico
Eu ouço e gosto muito mais de Chico
Eu juro que não acho o Philip Roth misógino
O pessoal deveria ler (e entender) o Rorty
O pessoal deveria ler (e entender) o Andrew Gelman
O Ikki >>>>> o Seya
O Batman humilha o Superman
O brasileiro é simpático, mas tenho dúvida se é generoso.
Com certeza, não pensa muito nos outros.
Não voto no PSDB nem fudendo.

 

Publicado em internet, Manoel Galdino, orquídeas selvagens | Deixe um comentário

Análise tática do jogo

A Alemanha massacrou o Brasil coletivamente. Não há o que discutir em cima disso. Mas gostaria de destacar algumas coisas:
1. o primeiro gol saiu em falha individual do David Luiz.
2. o Segundo gol saiu em falha de posicionamento do sistema defensivo e falha individual do Fernandinho, que tentou dar o bote e errou. Vejam os prints screen abaixo:

gol2_analise

O Jogador da Alemanha está na lateral e toca a bola no meio, próximo de onde está o Juiz. Fernandinho erra o bote e ele fica livre pra pensar e fazer a jogada. Dante sai para marcar o jogador que recebeu a bola no meio, e ele consegue tocar pro ponta que entrou na área entre o Marcelo e o Luiz Gustavo.

Gol2_analise2

Ao receber a bola marcado pelo Marcelo, o jogador alemão do meio (Klose) ficou sozinho para concluir. Nem Dante, nem Fernandinho, nem David Luiz, nem Luiz Gustavo acompanharam.

gol2_analise3

De verdade, um deles tinha que ficar no meio marcando a sobra e o Alemão que estava por lá. Mas os demais tinham que ter acompanhado o lance. Ficaram apenas olhando a conclusão da jogada, ao invés de continuarem a marcação.

gol2_analise4

3. No terceiro gol (abaixo), reparem na disposição dos times. A Alemanha tem 3 jogadores à frente da bola e mais o Toni Kros chegando (que é quem vai fazer o gol) e o jogador com a bola, totalizando 5 jogadores. O Brasil tem 7 jogadores atrás da linha da bola, com Marcelo, Dante, David Luiz e Maicon formando uma linha de quatro.

gol3_analise1

Hulk e Luiz Gustavo, contudo, estão mal posicionados. Não marcam ninguém nem estão em posição de interceptar seja o passe na ponta, seja o passe no meio, pro jogador que está livre. Às vezes, mesmo sem colar em alguém, a ocupação inteligente de espaços impede os passes e, portanto, a construção de jogadas. Não é o caso nesse lance. E Bernard olha pro lado, ao invés de tentar acompanhar o Toni Kross (reparem que o Oscar acompanha de perto um jogador).

Gol3_analise2

O Jogador Alemão cruza bola pro meio. Fernandinho (que estava marcando dois) corre em direção a bola. O Alemão fura e ela sobra para Kros sozinho chutar pro gol. Dante e Luiz Gustavo são inefetivos no lance. Não marcam ninguém nem servem para interceptar passe algum. Como David Luiz tinha Maicon na sobra, Dante não precisava ficar a li. Ele podia ter ido marcar o jogador que Fernandinho tentava marcar. Se ele fizesse isso, Fernandinho poderia ter marcado o Toni Kros. Ou ainda, se Bernard tivesse acompanhado Kross, a bola não sobraria limpa para ele. Por fim, se Luiz Gustavo tivesse mais bem posicionado no lance anterior, teria chegado perto do jogador Alemão e Fernandinho poderia marcar Kros no meio. A Falha de posicionamento de 3 jogadores torna inúteis a superioridade numérica no lance.

4. O quarto gol foi falha do Fernandinho (e de certa forma do Dante, que deu um passe meio na fogueira), que perdeu a bola e deixou a zaga exposta.

5. O quinto gol já é fruto do desespero e desobediência tática total. Um jogador alemão vem sozinho com a bola e dois jogadores tentam ganhar a dividida com ele. O erro aí é do David Luiz, que deixa o seu marcador livre, já que Luiz Gustavo, que não marcava ninguém, estava indo na bola. Era pro David continuar no marcador dele. E quem recebe a bola? Justamente aquele jogador que o David deixou livre. Mas aí já era desespero…

Gol5_analise1

Com o erro do David, ficou um jogador Alemão a mais do que brasileiro. Ah, detalhe do Maicon tentando deixar o jogador Alemão impedido. Isso mostra dessincronia (falta de entrosamento) da defesa brasileira. Mesmo que a bola fosse no jogador do Maicon (não foi), Marcelo daria condição. E como David Luiz tentou antecipar, Maicon ficou vendido no lance, incapaz até de fazer a sobra do David Luiz.

Gol5_analisefinal

Qual a conclusão dessa análise? Que a Alemanha não tem nada a ensinar ao Brasil, pois os gols saíram por erros individuais e alguns coletivos de posicionamento que teoricamente nossos jogadores saberiam evitar (fruto do desentrosamento do Dante com o sistema Defensivo, por ex.?)? Na verdade não. Em quase todos os lances, a origem do gol começa com um alemão com espaço no meio de campo, com tempo para pensar e decidir. No futebol moderno e contra grandes times, esse pecado é mortal. Esse, em minha opinião, o maior erro de Felipão. Perdemos o meio de campo e demos muito espaço para os jogadores entrarem de cabeça erguida, sozinhos, com espaço para pensar e criar. Nem no futebol brasileiro os nossos times marcam tão mal.

Com esse espaço todo, perderíamos mesmo com Thiago Silva e Neymar. Com um pouco mais de azar do time alemão nas finalizações, perderíamos não de 7, mas de 3 ou 4. O acidental e a pane explicam os erros defensivos, mas não a liberdade no meio para fazer os gols.

Publicado em futebol | Marcado com , , , , , , , , | Deixe um comentário

Aprendendo R e Python

Eu, juntamente com mais dois colegas (o Ricardo Ceneviva, professor do IESP, e o Davi Moreira, Doutorando do DCP-USP), iremos dar um curso de R no Rio, no final de Julho. Mais detalhes no cartaz abaixo.

E esse curso de R me animou a estudar novamente o Python. E após fazer alguns cursos on-line (sempre pela metade), decidi usar a mesma estratégia com Python que adotei com R. Mas afinal, como eu aprendi a usar R? Bem, foi na raça. Peguei o manual do R (aquele tosquinho mesmo) e saí lendo e executando e testando tudo que tinha lá. Foi assim que comecei. E depois passei a usar o R em minhas análises de dados. Descobri o stackoverflow, que me ajudou muito. E por fim, lendo código dos outros na internet. Eu comprei também uns 4 ou 5 livros, e os usei em partes que me eram úteis.

Então, pretendo fazer o mesmo com python. Peguei um manual (diveintopython), e vou tentar passar por tudo que tem lá. Depois quero ver se sigo um outro livro, para fazer jogos em python. Só pra me divertir um pouco. Se tudo isso der certo, vou pensar se estudo um pouco de Django como framework web de python. Mas isso é mais incerto, pois não tenho grandes objetivos em aprender a desenvolver pra web.

curso R inverno IESP

Publicado em estatística, Manoel Galdino | Marcado com , , , , , , , | 2 Comentários

Threshold knowledge

De acordo com a wikipedia, um threshold knowledge é um termo que descreve “core concepts that once understood, transform perception of a given subject “. Eu desconhecia esse termo até hoje, mas é mais ou menos isso que queria dizer neste post sobre o papel da educação na vida das pessoas.

Nesse site podem ser encontradas mais informações sobre esse termo.

 

Publicado em ciência, Manoel Galdino, Política e Economia | Marcado com , , , | Deixe um comentário

Homenagem a 1982

Escrevo esse post antes do Jogo de estreia do Brasil na Copa. É um post programado para sair hoje, sexta-feira. Espero que estejamos todos alegres da Vitória do Brasil.

Em todo caso, quer tenha havido vitória, quer tenha havido derrota (ou empate), creio que não será mal ver o vídeo abaixo. Eu tinha apenas 2 anos em 1982, mas vendo o vídeo, não pude deixar de pensar: como a gente conseguiu não ser campeão?

Publicado em futebol, orquídeas selvagens | Marcado com , , , , , , , , , , | 1 comentário

Tá chegando a hora… #vaiterCopa

Caetano Veloso disse uma vez que nossos pais fundadores talvez pudessem ser encontrados na música popular. Pode ser. Mas não duvidaria que nossos pais fundadores se encontrem mesmo é no futebol. Futebol que, diga-se de passagem, foi motivo de muita boa música produzida em solo nacional.

Eu, de minha parte, cresci lendo e ouvindo histórias de futebol. Muitas delas, da nossa seleção, como gostamos de chamar nosso time nacional. Todos os demais são times, só nós somos A Seleção.

Eu sempre gostei da história do Didi, nosso príncipe etíope. Sim, porque nosso futebol é uma dinastia, governada sempre por um rei, Pelé. Antes dos 5 minutos de jogo o Brasil tomou um gol da Suécia, na copa do mundo na Suécia. De imediato veio o fantasma do Maracanazzo – sim, porque nosso futebol também tem o sobrenatural, e temos muitos fantasmas a serem exorcizados. E foi então que Didi, nosso maior jogador (Pelé tinha então apenas 16 anos), pegou a bola no fundo do gol, colocou-a debaixo do braço, e calmamente andou em direção ao meio de campo, sem pressa alguma. Os demais jogadores desesperavam-se. “Estamos perdendo”, teria dito Zagallo a Didi. MAs Didi tinha nervos de aço, e fez o que precisava fazer: acalmar o time, porque a gente era muito melhor e na bola ganharíamos aquele jogo. Fizemos 5×2, na maior goleada de todos os tempos em uma final de Copa do Mundo, e o resto é história.

E foi nessa copa também que a Camisa 10 virou o símbolo do craque. Em nenhum outro esporte de massa, que eu saiba, existe um número que representa o melhor jogador do time. No futebol é a 10, e foi por causa do Brasil. Por acaso Pelé foi jogar com a dez, e depois do que ele fez, a dez ficou eternamente reservada para nosso craques. O Brasil sempre tem que ter um craque. Já foi Pelé, Rivelino, Zico, Garrincha, Romário, Ronaldo e agora Neymar. Falem o que quiser do Brasil, mas aqui a gente reverencia o craque. e Não se trata de individualismo, pois o futebol é essencialmente um esporte coletivo. Mas é um coletivo que não anula o individual.

Em 1962, o Brasil foi mais Brasil. Pelé, nosso craque, machucou-se. Amarildo entrou no lugar de Pelé e Garrincha jogou por ele mesmo e por Pelé. Garrincha, o Anjo das Pernas tortas, driblava sempre para o mesmo lado. E mesmo assim sempre enganava os adversários. Para Garrincha, todos os seus marcadores eram Joões, como era João o seu primeiro e maior marcador lá no campinho de areia em Pau Grande. E contamos ainda com a malandragem brasileira, que no futebol sempre foi arma nossa. Nilton Santos, a Enciclopédia do Futebol, num jogo decisivo, fez uma falta dentro da área e, para enganar o juiz, deu dois passos para fora da área e ergueu os braços. O Juiz marcou apenas falta, o Brasil evitou o gol e conseguimos nos classificar.

niltonsantos-penalti

~Em 1982, contudo, o Brasil sofreria mais uma tragédia, agora a tragédia do Sarriá. Era o fim do jogo bonito e do futebol arte, que eram a marca da seleção desde tempos imemoriais. Os Índios já jogavam futebol arte com os cocos antes dos Portugueses chegarem aqui. E quando os negros aportaram ao Brasil, já driblavam os feitores com toda a ginga que caracterizaria o futebol brasileiro.

Depois da tragédia do Sarriá, vários fantasmas passaram a assolar o futebol brasileiro. Da ideia de que o futebol feito é que daria resultado, consagrado no time de 90 – sim porque aquele time não merece ser chamado de Seleção; até o Fantasma das eliminações nos pênaltis – na copa de 1986 e na Copa América de 1993. Foi a copa de 1994 que trouxe novamente o alívio de sermos a melhor seleção do mundo, com um jogo inesquecível contra a Holanda no caminho e o pênalti perdido pelo Bággio na final.

Talvez precisássemos daquela Copa para aprendermos a ser mais realistas, entender nossos limites, reconhecer nossos defeitos. Hegel talvez visse, ali, o reflexo da nossa nova realidade. Não é a toa que a era FHC seria marcada pelo pragmatismo da adesão à globalização, ao mercado e a rejeição dos 50 anos antes.

E chegamos a mais uma Copa do Mundo, agora no Brasil. Uma Copa do Mundo organizada pela corrupta FIFA, com atrasos, desorganizações, mudanças de última hora, e corrupção e dinheiro mal gasto. Sim, uma Copa do Mundo com todos esses problemas, e que sem sombra de dúvidas, problemas que merecem todo nosso repúdio. Mas não é apenas a Copa do Mundo da FIFA. É também a Copa do Mundo da FIFA. Pois é, principalmente, a Copa do Mundo do Futebol.

E no Futebol nós nos sentimos em casa. Dentro das quatro linhas, não há Seleção mais respeitada do que a nossa. Aqui não se torce como na Europa, por mais que queiram fazer isso.  Como cantam todas as torcidas

Não quero cadeira numerada,
Vou ficar na arquibancada
Prá sentir mais emoção

Por isso que, nessa Copa do Mundo de Futebol, eu não vou fazer a Copa do Mundo da FIFA. Mas tampouco vou me recusar a ver jogo, a torcer ou a vestir a camisa do Brasil. Pelo contrário, vou fazer a copa do meu jeito. Do jeito Brasileiro de ser. Respeitar nossa história e nossa tradição, nessa Copa do Mundo, é lembrar de nossa história, torcer pelo Brasil e vivenciar a Copa do jeito Brasileiro de ser. Com nossos fantasmas, nosso príncipes, nossas tragédias, nossa malandragem, nosso sangue frio (assim espero), e na arquibancada – isto é, nas ruas -, pra sentir mais emoção.

 

 

 

Publicado em Arte e Cultura, futebol, Política e Economia | Marcado com , , , , , , , , , , | 1 comentário