[R-br] Nome de Função

rcoster em gmail.com rcoster em gmail.com
Sexta Outubro 24 09:24:38 BRST 2014


David,

Mais uma tentativa, agora mais certeira (acho eu): um *funcao <-
get(selecao) *não resolve o teu problema? Ainda fica em 2 variáveis, mas
pelo menos te livra da sequencia de if/elseif/else.

Para correr todos valores, bastaria um *for (selecao in c("singleLink",
"completeLink", "groupAverage", "ward")) { ... }*


[]'s


On Fri Oct 24 2014 at 09:07:07 David Feitosa <contato em davidfeitosa.com>
wrote:

> Caríssimos,
>
> Eu notei que o e-mail que enviei ontem não foi permitido pelo tamanho das
> imagens.
> Estou reenviando, mas com um link externo que as contem.
> Segue...
> ---
>
> rcoster,
>
> Na verdade não é bem isso.
> Vou colocar aqui um trecho com a chamada do código
> e pode ser que fique mais claro.
>
> Estou fazendo uma disciplina em que o trabalho atual consiste em
> algoritmos de Clusterização.
> Nele, tive que implementar a função que realiza o agrupamento hierárquico.
> Esse agrupamento pode variar segundo fórmulas que geram as distâncias
> entre elementos do dataset.
> Os métodos que já implementei foram: singleLink, completeLink,
> groupAverage e ward.
>
> Na chamada da função, eu devo permitir que o usuário defina qual o
> critério da distância.
> Como eu não sei fazer esse procedimento de pegar o nome da função,
> tive que implementar passando uma sequência de caracteres e, internamente
> na função,
> verificar a qual função ela mapeia, na seguinte forma:
>
> #inicio
>
> selecao <- "singleLink"
> #selecao <- "completeLink"
> #selecao <- "groupAverage"
> #selecao <- "ward"
>
> #chamada da funcao
> clusterHierarquico(dados, selecao)
>
> #dentro do corpo de clusterHierarquico(...)
>
>   #definindo a funcao para escolha dos valores entre distancias dos grupos
>   funcao <- NULL
>   if(selecao == "completeLink"){
>     funcao <- completeLink
>   }else if(selecao == "groupAverage"){
>     funcao <- groupAverage
>   }else if(selecao == "ward"){
>     funcao <- ward
>   }else{
> #padrao
>     funcao <- singleLink
>   }
>
> #usa funcao como método para calculo das distancias
>
> #fim
>
> Embora eu consiga gerar pelos nomes, fazendo a verificação com IFELSE,
> isso deixa o código "preso".
> Se houvesse uma forma de pegar o nome da função que é passada como
> argumento,
> eu poderia usar esse procedimento para pegar o nome e usar no plot do
> dendrograma.
>
> Abaixo, seguem os gráficos que estou gerando de acordo com um dataset de
> países europeus com 2 atributos:
> inflação e taxa de desemprego:
>
>
> http://figshare.com/articles/M_todos_de_Dist_ncia_para_Cluster_Hier_rquico/1213685
>
> Deysi enviou-me mensagem de que há uma forma, mas ainda não me retornou
> com a solução, pois não está com acesso ao PC dela no momento.
>
> Caso tenha ficado mais claro agora e alguém saiba como resolver, agradeço
> antecipadamente.
>
> Eu sei que pode parecer um "exagero", mas gostaria de deixar o código mais
> flexível,
> até como forma de aprender para implementações mais complexas no futuro.
>
>
>
>
> Atenciosamente,
>
> David Feitosa
>
> (\_(\
> (=°;°)
> (("")("")
>
> Em 23 de outubro de 2014 10:11, <rcoster em gmail.com> escreveu:
>
> David,
>>
>> Não sei se isso pode te ajudar ou não, mas o pacote data.table tem um
>> comportamento parecido com o que tu quer: ao fazer um "banco2 <- banco"
>> (onde banco é um arquivo data.table), as 2 variáveis ficam associadas:
>> alterando banco2, tu altera também banco (e vice-versa). Na verdade, a
>> operação '<-' para data.tables cria uma referência e não uma cópia.
>>
>> *Talvez* seja isso que tu precisa fazer. Agora, como fazer isso eu não
>> sei.
>>
>> On Thu Oct 23 2014 at 10:53:13 Benilton Carvalho <
>> beniltoncarvalho em gmail.com> wrote:
>>
>>> Putz... pode ser que haja um meio, mas eu desconheco... se vc estivesse
>>> usando diretamente min/max, seria o match.call mesmo... mas assinalando-a
>>> para uma outra funcao, fica um pouco mais complexo... Sorry por nao ajudar.
>>>
>>> Em 23 de outubro de 2014 03:36, David Feitosa <contato em davidfeitosa.com>
>>> escreveu:
>>>
>>> Benilton, não seria bem isso...
>>>>
>>>> Seria algo do tipo:
>>>>
>>>> #min e max são as funções padrões do R
>>>> f <- min
>>>> #f <- max
>>>>
>>>> nome <- algumaFormaDeExtrairOnomeDaFuncao(f)
>>>>
>>>> #dados = estrutura de dados para plotar
>>>> #nome = titulo do grafico
>>>> plot(dados, main = nome)
>>>>
>>>> Eu gostaria de saber qual o nome da funcao *f*, nesse caso *min* ou
>>>> *max*,
>>>> mas sem ter que fazer um "IFELSE" para mudar o titulo do plot.
>>>>
>>>> No meu caso, serviria para saber qual função foi aplicada
>>>> aquela massa de dados e que gerou o gráfico.
>>>>
>>>>
>>>>
>>>> Atenciosamente,
>>>>
>>>> David Feitosa
>>>>
>>>> (\_(\
>>>> (=°;°)
>>>> (("")("")
>>>>
>>>> Em 22 de outubro de 2014 23:20, Benilton Carvalho <
>>>> beniltoncarvalho em gmail.com> escreveu:
>>>>
>>>> David,
>>>>>
>>>>> perdoe minha ignorancia, mas eu nao entendi para o que vc
>>>>> utilizaria... mas, eu acho que o q vc quer e':
>>>>>
>>>>> minhaFuncao <- function(){
>>>>> ## codigo
>>>>> print(match.call()[[1]])
>>>>> ## mais codigo
>>>>> }
>>>>>
>>>>> vc pode ate' usar as.character(match.call()[[1]]) se quiser a string
>>>>> do nome da funcao...
>>>>>
>>>>> b
>>>>>
>>>>> Em 22 de outubro de 2014 17:41, David Feitosa <davidfeitosa em gmail.com>
>>>>> escreveu:
>>>>>
>>>>>> Caríssimos, boa noite.
>>>>>>
>>>>>> Existe modo de se obter o nome de uma função em tempo de execução?
>>>>>>
>>>>>> Explicando melhor: eu tenho uma função da forma
>>>>>>
>>>>>> minhaFuncao <-function(){
>>>>>> #codigo
>>>>>> }
>>>>>>
>>>>>> e uma variável que recebe essa função:
>>>>>>
>>>>>> f <- minhaFuncao
>>>>>>
>>>>>> Eu gostaria de obter o nome dela para ser usado em um gráfico
>>>>>>
>>>>>> Em Java, eu sei que poderia usar a API de Reflection para, em tempo
>>>>>> de execução,
>>>>>> analisar a classe, seus métodos etc e obter o nome para uso posterior.
>>>>>>
>>>>>> Há como fazer o equivalente em R?
>>>>>>
>>>>>> No meu caso, bastaria saber qual o nome da função que a variável "f"
>>>>>> carrega.
>>>>>>
>>>>>> Grato.
>>>>>>
>>>>>> Atenciosamente,
>>>>>>
>>>>>> David Feitosa
>>>>>>
>>>>>> (\_(\
>>>>>> (=°;°)
>>>>>> (("")("")
>>>>>>
>>>>>> _______________________________________________
>>>>>> R-br mailing list
>>>>>> R-br em listas.c3sl.ufpr.br
>>>>>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>>>>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
>>>>>> código mínimo reproduzível.
>>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> R-br mailing list
>>>>> R-br em listas.c3sl.ufpr.br
>>>>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>>>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
>>>>> código mínimo reproduzível.
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> R-br mailing list
>>>> R-br em listas.c3sl.ufpr.br
>>>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
>>>> código mínimo reproduzível.
>>>>
>>> _______________________________________________
>>> R-br mailing list
>>> R-br em listas.c3sl.ufpr.br
>>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
>>> código mínimo reproduzível.
>>
>>
>> _______________________________________________
>> R-br mailing list
>> R-br em listas.c3sl.ufpr.br
>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
>> código mínimo reproduzível.
>>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
> código mínimo reproduzível.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20141024/8d36b743/attachment.html>


Mais detalhes sobre a lista de discussão R-br