Criar função no R com if e for

Olá pessoal, gostaria mais uma vez da ajuda de vocês. Eu estou precisando criar uma função no R que tem três condições e após testar todas as condições o programa me retorne um resultado na forma de vetor para cada valor (input) na função. Segue o código que consegui fazer até agora: x=c(-5,-4,-3,-2,-1,0,1,2,3,4,5);x fr=function(x){ r=numeric(length = length(x)); for(i in seq(along=x)){ if(x<-3){r[i]=0} else if(x>=-3 && x<=2){r[i]=3*x} else{r[i]=1} } return(r) } rs=fr(x);rs O resultado saí: 0 0 0 0 0 0 0 0 0 0 0 Se eu tenho só um valor no vetor e não utilizo o "for" consigo resolver, mas se o vetor tem mais de um valor dá erro. Desde já grato pela atenção/ajuda. -- Rodolfo Marcondes Silva Souza Engenheiro Agrônomo Mestre em Produção Vegetal - UFRPE/UAST Doutorando em Tecnologias Energéticas e Nucleares - UFPE/DEN Currículo Lattes <http://lattes.cnpq.br/4486320338778858>

2014-09-29 17:47 GMT-04:00 Rodolfo Souza <rodolfomssouza@gmail.com>:
Olá pessoal, gostaria mais uma vez da ajuda de vocês.
Eu estou precisando criar uma função no R que tem três condições e após testar todas as condições o programa me retorne um resultado na forma de vetor para cada valor (input) na função. Segue o código que consegui fazer até agora:
x=c(-5,-4,-3,-2,-1,0,1,2,3,4,5);x
fr=function(x){ r=numeric(length = length(x)); for(i in seq(along=x)){ if(x<-3){r[i]=0}
Tem dois erros na linha acima. Deveria ser x[i] e não simplesmente x. E deveria ser "< -3" e não "<- 3".
else if(x>=-3 && x<=2){r[i]=3*x}
Deveria ser x[i], novamente. Além disso, o uso do loop for no R é muito lento. Se for trabalhar com muitos dados, é melhor escrever uma versão vetorizada da função: fr <- function(x){ y <- rep(1, length(x)) y[x < -3] <- 0 y[x >= -3 & x < 2] <- 3 * x[x >= -3 & x < 2] y } -- Jakson Aquino http://www.lepem.ufc.br/aquino.php

Olha se é isso aí x=c(-5,-4,-3,-2,-1,0,1,2,3,4,5);x fr=function(x){ r=length(x) for(i in 1:r){ if(x[i]< -3){r[i]=0} else if(x[i]>=-3 && x[i]<=2){r[i]=3*x[i]} else{r[i]=1} } return(r) } rs=fr(x);rs On 29-09-2014 19:32, Jakson Alves de Aquino wrote:
2014-09-29 17:47 GMT-04:00 Rodolfo Souza <rodolfomssouza@gmail.com>:
Olá pessoal, gostaria mais uma vez da ajuda de vocês.
Eu estou precisando criar uma função no R que tem três condições e após testar todas as condições o programa me retorne um resultado na forma de vetor para cada valor (input) na função. Segue o código que consegui fazer até agora:
x=c(-5,-4,-3,-2,-1,0,1,2,3,4,5);x
fr=function(x){ r=numeric(length = length(x)); for(i in seq(along=x)){ if(x<-3){r[i]=0} Tem dois erros na linha acima. Deveria ser x[i] e não simplesmente x. E deveria ser "< -3" e não "<- 3".
else if(x>=-3 && x<=2){r[i]=3*x}
Deveria ser x[i], novamente.
Além disso, o uso do loop for no R é muito lento. Se for trabalhar com muitos dados, é melhor escrever uma versão vetorizada da função:
fr <- function(x){ y <- rep(1, length(x)) y[x < -3] <- 0 y[x >= -3 & x < 2] <- 3 * x[x >= -3 & x < 2] y }

Por questões de desempenho é interessante que se evite aplicar a mestra instrução repetidas vezes, como por exemplo x>2. O resultado pode ser guardado e depois apenas consultado. Da mesma forma, se você tem o vetor lógico de x>2 basta invetê-lo para ter o de x<=2 uma vez que x>2 é igual à !(x<=2). Segue a adaptação que fiz do código do Jakson. fr <- function(x){ i <- x< -3 j <- x> 2 y <- 3*x y[i] <- 0 y[j] <- 1 y } fr(x) curve(fr, -4, 6) À disposição. Walmes.

e pra quem quiser comecar a brincar com Rcpp.... library(Rcpp) cppFunction( 'NumericVector fr0(NumericVector x){ int n=x.size(); NumericVector r(n); for (int i=0; i<n; i++){ if (x[i] < -3){ r[i]=0; }else if(x[i] >= -3 & x[i] <=2){ r[i]=3*x[i]; }else{ r[i]=1; } } return r; }') x=c(-5,-4,-3,-2,-1,0,1,2,3,4,5) fr0(x) Em 29 de setembro de 2014 22:13, walmes . <walmeszeviani@gmail.com> escreveu:
Por questões de desempenho é interessante que se evite aplicar a mestra instrução repetidas vezes, como por exemplo x>2. O resultado pode ser guardado e depois apenas consultado. Da mesma forma, se você tem o vetor lógico de x>2 basta invetê-lo para ter o de x<=2 uma vez que x>2 é igual à !(x<=2). Segue a adaptação que fiz do código do Jakson.
fr <- function(x){ i <- x< -3 j <- x> 2 y <- 3*x y[i] <- 0 y[j] <- 1 y }
fr(x) curve(fr, -4, 6)
À disposição. Walmes.
_______________________________________________ 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.

Muito obrigado a todos pela atenção e diposição. Resolveu o meu problema. Eu tinha passado um dia e meio procurando a solução em forúns, blogs, apostilas... Valeu pela ajuda. 2014-09-29 17:47 GMT-04:00 Rodolfo Souza <rodolfomssouza@gmail.com>:
Olá pessoal, gostaria mais uma vez da ajuda de vocês.
Eu estou precisando criar uma função no R que tem três condições e após testar todas as condições o programa me retorne um resultado na forma de vetor para cada valor (input) na função. Segue o código que consegui fazer até agora:
x=c(-5,-4,-3,-2,-1,0,1,2,3,4,5);x
fr=function(x){ r=numeric(length = length(x)); for(i in seq(along=x)){ if(x<-3){r[i]=0} else if(x>=-3 && x<=2){r[i]=3*x} else{r[i]=1} } return(r) }
rs=fr(x);rs
O resultado saí: 0 0 0 0 0 0 0 0 0 0 0
Se eu tenho só um valor no vetor e não utilizo o "for" consigo resolver, mas se o vetor tem mais de um valor dá erro.
Desde já grato pela atenção/ajuda.
-- Rodolfo Marcondes Silva Souza Engenheiro Agrônomo Mestre em Produção Vegetal - UFRPE/UAST Doutorando em Tecnologias Energéticas e Nucleares - UFPE/DEN Currículo Lattes <http://lattes.cnpq.br/4486320338778858>
-- Rodolfo Marcondes Silva Souza Engenheiro Agrônomo Mestre em Produção Vegetal - UFRPE/UAST Doutorando em Tecnologias Energéticas e Nucleares - UFPE/DEN Currículo Lattes <http://lattes.cnpq.br/4486320338778858>
participantes (5)
-
Benilton Carvalho
-
Fernando Souza
-
Jakson Alves de Aquino
-
Rodolfo Souza
-
walmes .