[R-br] Nome de Função

David Feitosa contato em davidfeitosa.com
Sexta Outubro 24 13:05:26 BRST 2014


rcoster, não era bem isso, mas acho que talvez sirva.
vou fazer um teste. pelo que vi o get carrega a definição do objeto, no
caso, uma função.

o que eu achei no meio das buscas aqui foi esse código, mas acho que
resolve parcial também.

https://stat.ethz.ch/pipermail/r-help/2006-October/114431.html

f <- function(x) {
	if (!is.list(x)) x <- list(x)
	if (is.null(names(x))) names(x) <- ""
	names(x)[names(x) == ""] <- NA
	mc <- match.call()[-1][[1]]
	if (length(mc) > 1) mc <- mc[-1]
	ifelse(is.na(names(x)), as.character(mc), names(x))
}

f(c(a = mean))
f(list(a = mean, b = sd))
f(c(f = function(x)x*x))
f(list(f = function(x)x*x, function(x)1-x))
L <- list(a = mean, b = sd)
f(L)
L <- list(a = mean, function(x)x)
f(L)

f(mean)
f(list(a = mean, sd))
f(list(mean, sd))
f(function(x)x*x)
f(list(function(x)x*x, function(y)y-1))


obrigado pelo esforço. vou dar uma testada. [?]






Atenciosamente,

David Feitosa

(\_(\
(=°;°)
(("")("")

Em 24 de outubro de 2014 08:24, <rcoster em gmail.com> escreveu:

> 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.
>
>
> _______________________________________________
> 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/b621ea5f/attachment.html>
-------------- Próxima Parte ----------
Um anexo não-texto foi limpo...
Nome: 330.gif
Tipo: image/gif
Tamanho: 96 bytes
Descrição: não disponível
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20141024/b621ea5f/attachment.gif>


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