[R-br] Passar parâmetro para with() dentro de uma função

Rodrigo Coster rcoster em gmail.com
Segunda Agosto 19 17:36:06 BRT 2013


Consegui resolver (com ajuda do pessoal do
stackoverflow<http://stackoverflow.com/questions/18321794/passing-parameters-to-with-via-function>,
mas consegui :p)

Ficou assim:

dados <- data.frame(x=1:10, v1=rnorm(10), v2=rnorm(10))

func <- function(data, funcao) {
 funcao <- parse(text=funcao)
 return(with(data, eval(funcao)))
}

func(dados, 'v1+v2')

Valeu Fernando e Rogério pela ajuda!


2013/8/19 Rogério Barbosa <antrologos em gmail.com>

> Desculpe... achei um erro. Não resolvi seu problema.
>
> Dentro da função escrevi
>  with(my.env$subdata,v1+v2)
>
> Ao invés de:
>  with(my.env$subdata,operacao)
>
>
>
>
> 2013/8/19 Rogério Barbosa <antrologos em gmail.com>
>
>> Olá Rodrigo,
>>
>> Consegui fazer sua função funcionar -- embora eu mesmo não tenha
>> entendido bem o método que empreguei... rs
>>
>> Fato é que já vi diversas vezes o R não lidar bem com a relação
>> local/global environment. Supus que seu problema era um caso desse. Então
>> criei um environment dentro da função e atribui a um objeto o conteúdo de
>> "data". Quando aplico a função with, já faço uso desse objeto dentro do
>> environment criado.
>>
>>
>> rm(list=ls())
>> dados=data.frame(x=1:10,v1=rnorm(10),v2=rnorm(10))
>>
>> f = function(data,operacao) {
>>     my.env <- new.env()
>>
>>     assign("subdata", data, envir=my.env)
>>
>>     with(my.env$subdata,v1+v2)
>>     }
>>
>> f(dados,operacao=v1+v2)
>>
>>
>> abraço,
>> Rogério
>>
>>
>> 2013/8/19 Rodrigo Coster <rcoster em gmail.com>
>>
>>> Fernando,
>>>
>>> foi desatenção minha na hora de fazer o exemplo. Segue sem repetir nomes
>>> e com o problema persistindo.
>>>
>>> dados <- data.frame(x=1:10, v1=rnorm(10), v2=rnorm(10))
>>>
>>> with(dados, v1+v2)
>>>
>>> func <- function(data, funcao) {
>>>  with(data, funcao)
>>> }
>>> func(dados, v1+v2)
>>> func(dados, 'v1+v2')
>>>
>>>
>>> 2013/8/19 FHRB Toledo <fernandohtoledo em gmail.com>
>>>
>>>> Faça:
>>>>
>>>> planilha <- data.frame(x=1:10, v1=rnorm(10), v2=rnorm(10))
>>>>
>>>> with(planilha, v1+v2) # Fora da função funciona
>>>>
>>>> func <- function(dados, func) {
>>>>  with(dados, func)
>>>> }
>>>>
>>>> func(planilha, v1+v2) # Da erro na hora de chamar a função
>>>>
>>>> Talvez seja qq confusão na atribuição de nomes, parâmetros para a
>>>> função.
>>>>
>>>> att,
>>>> FH
>>>>
>>>>
>>>> 2013/8/19 Rodrigo Coster <rcoster em gmail.com>
>>>>
>>>>>  Caros,
>>>>>
>>>>> eu tenho uma função que me retorna um data.frame() com várias colunas
>>>>> que vou utilizar para outros calculos. Eu queria facilitar a minha vida e
>>>>> colocar esses calculos dentro da função, como um parâmetro (dado que não
>>>>> existe somente um calculo). Encontrei uma maneira de fazer isso fora da
>>>>> função pelo with() ou até mesmo evalq(), só que não consegui fazer isso
>>>>> dentro da função. Eu entendo os erros que dão e concordo com eles, mas não
>>>>> consegui encontrar uma maneira que funcione.
>>>>>
>>>>> Basicamente é isso:
>>>>>
>>>>> dados <- data.frame(x=1:10, v1=rnorm(10), v2=rnorm(10))
>>>>>
>>>>> with(dados, v1+v2) # Fora da função funciona
>>>>>
>>>>> func <- function(data, func) {
>>>>>  with(dados, func)
>>>>> }
>>>>> func(dados, v1+v2) # Da erro na hora de chamar a função
>>>>> func(dados, 'v1+v2') # Retorna o string
>>>>>
>>>>> Alguma sugestão/solução?
>>>>>
>>>>> _______________________________________________
>>>>> 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/20130819/a3d655b2/attachment.html>


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