R: round () can find an object, sprintf () can't, why?

I have a function that takes a data frame and displays multiple columns from this data frame using ggplot2. The aes () function in ggplot2 takes a label argument, and I want to use sprintf to format this argument - and this is what I did many times before in other code. When I pass the sprintf format string (in this case, "% 1.1f"), it says "object not found". If I use the round () function and pass an argument to this function, it can find it without problems. The same goes for format (). Apparently, only sprintf () cannot see the object.

At first I thought it was a lazy evaluation problem caused by calling a function, not using inline code, but using force () in the format string that I pass to sprintf does not solve the problem. I can get around this, but I would like to know why this is happening. Of course, this may be something trivial that I missed.

Q. Why does sprintf () not find a string object?

The following is the code (edited and cropped for a more minimal example)

require(gdata)
require(ggplot2)
require(scales)
require(gridExtra)
require(lubridate)
require(plyr)
require(reshape)

set.seed(12345)
# Create dummy time series data with year and month
monthsback <- 64
startdate <- as.Date(paste(year(now()),month(now()),"1",sep = "-")) - months(monthsback)
mydf <- data.frame(mydate = seq(as.Date(startdate), by = "month", length.out = monthsback), myvalue5 = runif(monthsback, min = 200, max = 300))
mydf$year <- as.numeric(format(as.Date(mydf$mydate), format="%Y"))
mydf$month <- as.numeric(format(as.Date(mydf$mydate), format="%m"))

getchart_highlight_value <- function(
                          plotdf,
                          digits_used = 1
                          )
{
    force(digits_used)
    #p <- ggplot(data = plotdf, aes(x = month(mydate, label = TRUE), y = year(mydate), fill = myvalue5, label = round(myvalue5, digits_used))) +
    # note that the line below using sprintf() does not work, whereas the line above using round() is fine
    p <- ggplot(data = plotdf, aes(x = month(mydate, label = TRUE), y = year(mydate), fill = myvalue5, label = sprintf(paste("%1.",digits_used,"f", sep = ""), myvalue5))) +
      scale_x_date(labels = date_format("%Y"), breaks = date_breaks("years")) +
      scale_y_reverse(breaks = 2007:2012, labels = 2007:2012, expand = c(0,0)) +
      geom_tile() + geom_text(size = 4, colour = "black") +
      scale_fill_gradient2(low = "blue", high = "red", limits = c(min(plotdf$myvalue5), max(plotdf$myvalue5)), midpoint = median(plotdf$myvalue5)) +
      scale_x_discrete(expand = c(0,0)) +
      opts(panel.grid.major = theme_blank()) +
      opts(panel.background = theme_rect(fill = "transparent", colour = NA)) +
      png(filename = "c:/sprintf_test.png", width = 700, height = 300, units = "px", res = NA)
      print(p)
      dev.off()
}

getchart_highlight_value (plotdf <- mydf,
                          digits_used <- 1)
+3
source share
2 answers

Using Martin's minimal example (this is the minimum example, see also this question ), you can get the code to work by specifying the environment ggplot()should use. To do this, specify an argument environmentin the function ggplot(), for example, for example:

require(ggplot2)

getchart_highlight_value <- function(df)
{
  fmt <- "%1.1f"
  ggplot(df, aes(x, x, label=sprintf(fmt, lbl)),
         environment = environment()) + 

  geom_tile(bg="white") + 
  geom_text(size = 4, colour = "black")
}

df <- data.frame(x = 1:5, lbl = runif(5))
getchart_highlight_value (df)

environment() () , , getchart_highlight_value(). , ggplot() , fmt .

, .

:

enter image description here

+4

er

require(ggplot2)

getchart_highlight_value <- function(df)
{
    fmt <- "%1.1f"
    ggplot(df, aes(x, x, label=sprintf(fmt, lbl))) + geom_tile()
}

df <- data.frame(x = 1:5, lbl = runif(5))
getchart_highlight_value (df)

> getchart_highlight_value (df)
Error in sprintf(fmt, lbl) : object 'fmt' not found

fmt , ; , " " / " " .

> sessionInfo()
R version 2.15.0 Patched (2012-05-01 r59304)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggplot2_0.9.1

loaded via a namespace (and not attached):
 [1] colorspace_1.1-1   dichromat_1.2-4    digest_0.5.2       grid_2.15.0       
 [5] labeling_0.1       MASS_7.3-18        memoise_0.1        munsell_0.3       
 [9] plyr_1.7.1         proto_0.3-9.2      RColorBrewer_1.0-5 reshape2_1.2.1    
[13] scales_0.2.1       stringr_0.6       
+4

All Articles