Passar parâmetro para with() dentro de uma função

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?

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@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@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.

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@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@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@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@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.

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@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@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@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@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@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@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.

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@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@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@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@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@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@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@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.

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@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@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@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@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@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@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@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@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@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.
participantes (3)
-
FHRB Toledo
-
Rodrigo Coster
-
Rogério Barbosa