[R] R-help Digest, Vol 217, Issue 25
phii m@iii@g oii phiiipsmith@c@
phii m@iii@g oii phiiipsmith@c@
Thu Mar 25 14:38:46 CET 2021
Thank you, Messrs Barradas and Gross, for your very helpful advice.
Philip
>
> Message: 21
> Date: Wed, 24 Mar 2021 22:41:25 -0400
> From: "Avi Gross" <avigross using verizon.net>
> To: <r-help using r-project.org>
> Subject: Re: [R] Including a ggplot call with a conditional geom in a
> function
> Message-ID: <07e801d72120$59e5c720$0db15560$@verizon.net>
> Content-Type: text/plain; charset="us-ascii"
>
> This may not be the right place to ask about ggplot which is part of
> packages but are you aware how ggplot works additively?
>
> You can say something like:
>
> P <- ggplot(...) ... + ...
>
> Then later say:
>
> P <- p + geom_...()
>
> And so on.
>
> So if you set al the layers you want first into a variable like p, then
> in
> an if statement you selectively add in one or another layer and finally
> add
> in all remaining layers before printing it, would that simply meet your
> need?
>
> Realistically, ggplot creates a data structure and the PLUS of other
> layers
> updates or expands that structure but nothing happens till you print it
> and
> it evaluates the data structure.
>
> -----Original Message-----
> From: R-help <r-help-bounces using r-project.org> On Behalf Of
> phil using philipsmith.ca
> Sent: Wednesday, March 24, 2021 10:24 PM
> To: r-help using r-project.org
> Subject: [R] Including a ggplot call with a conditional geom in a
> function
>
> How can I write an R function that contains a call to ggplot within it,
> with
> one of the ggplot geom statements being conditional? In my reprex, I
> want
> the plot to contain a horizontal zero line if the y values are both
> positive
> and negative, and to exclude the horizontal line if all of the y values
> are
> of the same sign. I tried a simple if statement, but it does not work.
> Suggestions appreciated. Philip
>
> library(rlang)
> library(tidyverse)
>
> a <- c(1:8)
> b <- c(23,34,45,43,32,45,68,78)
> c <- c(0.34,0.56,0.97,0.33,-0.23,-0.36,-0.11,0.17)
> df <- data.frame(a,b,c)
>
> posNeg <- function(x) {
> ifelse(sum(x>0)>0 & sum(x>0)<length(x), y <- TRUE,y <- FALSE) }
> plotLineFunc <- function(MYdf,MYx,MYy) {
> ggplot(MYdf,aes(x={{MYx}},y={{MYy}}))+
> #if(posNeg({{MYy}})) geom_hline(yintercept=0,size=0.2)+ # This
> does not work
> geom_line(colour="black",size=0.5)
> }
> (plot1 <- plotLineFunc(df,a,b))
> (plot2 <- plotLineFunc(df,a,c))
>
> ______________________________________________
>
> Message: 24
> Date: Thu, 25 Mar 2021 06:23:48 +0000
> From: Rui Barradas <ruipbarradas using sapo.pt>
> To: phil using philipsmith.ca, r-help using r-project.org
> Subject: Re: [R] Including a ggplot call with a conditional geom in a
> function
> Message-ID: <a190f6cc-20b6-929b-8e7b-9a4ca7b0c717 using sapo.pt>
> Content-Type: text/plain; charset="utf-8"; Format="flowed"
>
> Hello,
>
> In the following code, the fixed parts of the plot are drawn first,
> assigning the plot to p. Then geom_hline is conditionally added to p
> and
> the result returned to caller.
> This may be a problem if the conditional geom needs to be in a
> specified
> order in the plot. Function plotLineFunc2 adds everything in the order
> of the question and is probably a better way of solving the problem.
>
> I have also rewritten posNeg() without ifelse.
>
> posNeg <- function(x) sum(x>0)>0 & sum(x>0)<length(x)
>
> plotLineFunc <- function(MYdf,MYx,MYy) {
> p <- ggplot(MYdf,aes(x={{MYx}},y={{MYy}}))+
> geom_line(colour="black",size=0.5)
> if(posNeg({{MYy}}))
> p + geom_hline(yintercept=0,size=0.2)
> else p
> }
>
> plotLineFunc2 <- function(MYdf,MYx,MYy) {
> p <- ggplot(MYdf,aes(x={{MYx}},y={{MYy}}))
> p <- if(posNeg({{MYy}}))
> p + geom_hline(yintercept=0,size=0.2)
> else p
> p + geom_line(colour="black",size=0.5)
> }
>
>
> (plot1 <- plotLineFunc(df,a,b))
> (plot2 <- plotLineFunc(df,a,c))
>
>
> Hope this helps,
>
> Rui Barradas
More information about the R-help
mailing list