R:round()可以找到对象,sprintf()不能,为什么?

R:round()可以找到对象,sprintf()不能,为什么?,r,ggplot2,R,Ggplot2,我有一个函数,它获取一个数据帧,并使用ggplot2从该数据帧中绘制许多列。ggplot2中的aes()函数接受一个label参数,我想使用sprintf格式化该参数——这是我以前在其他代码中多次做过的事情。当我将格式字符串传递给sprintf(在本例中为“%1.1f”)时,它会显示“找不到对象”。如果我使用round()函数并将一个参数传递给该函数,它可以毫无问题地找到它。format()也是如此。显然只有sprintf()无法看到对象 起初,我认为这是由于调用函数而不是使用内联代码导致的延迟

我有一个函数,它获取一个数据帧,并使用ggplot2从该数据帧中绘制许多列。ggplot2中的aes()函数接受一个label参数,我想使用sprintf格式化该参数——这是我以前在其他代码中多次做过的事情。当我将格式字符串传递给sprintf(在本例中为“%1.1f”)时,它会显示“找不到对象”。如果我使用round()函数并将一个参数传递给该函数,它可以毫无问题地找到它。format()也是如此。显然只有sprintf()无法看到对象

起初,我认为这是由于调用函数而不是使用内联代码导致的延迟求值问题,但对传递给sprintf的格式字符串使用force()并不能解决该问题。我可以解决这个问题,但我想知道为什么会这样。当然,这可能是我忽略的一些琐事

为什么sprintf()找不到string对象

代码如下(编辑和删减以获得更简单的示例)

require(gdata)
需要(ggplot2)
需要(天平)
需要(额外)
要求(润滑)
需要(plyr)
需要(重塑)
种子集(12345)
#使用年和月创建虚拟时间序列数据

monthsback这里有一个最小的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)
如果我在全球环境中创建
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       

使用Martin的最小示例(这是一个最小示例,另请参见),您可以通过指定
ggplot()
应该使用的环境使代码正常工作。为此,请在
ggplot()
函数中指定参数
environment
,例如:

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)
require(ggplot2)

getchart_highlight_value你能把它作为一个简单的例子吗?你的代码没有在R2.15中运行。我在get(x,envir=this,inherits=inh)(this,…)中得到
错误:未使用的参数(labels=function(x)format(x,format),breaks=function(x)fullseq(x,width))
谢谢@baptiste和Joris,我们将尽快研究这两个问题。只是猜测一下,但是
sprintf
是否缺少识别
ggplot2内部的方法(dfdata…
,它应该寻找
dfdata$current\u col
而不是一个独立的对象
current\u col
?为糟糕的术语道歉——也许我应该这样说,因为
ggplot2
没有正确地将正确的对象
current\u col
发送到
sprintf
?@baptiste-“更多”最简单的例子总结一下:你能确认你正在使用最新的ggplot2和R2.15吗?当我们在使用时,有人能验证一下等价的
label=sprintf(fmt,lbl)吗
在其他函数或包中是否正常工作?@CarlWitthoft-Martin或我自己?我使用ggplot2 0.9.1和2.15.+1提供答案,但我认为这只是解释的一半。好吧,调用
ggplot
geom…
将所有参数计算为
aes()
数据
数据帧的环境中,不是全局的。这就是它失败的原因。@Andrie-我刚刚检查了代码的“生产版本”,而不是最简单的示例,添加environment=environment()确实解决了sprintf()的问题无法找到该变量。这与您的论文一致吗?@Andrie ggplot.data.frame中环境的默认值为globalenv()@JorisMeys谢谢。现在它有意义了!@JorisMeys-这是一次教育,促进了我对R和ggplot2的理解,这正是我发布问题时所希望的。谢谢!
> 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       
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)