gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:55:23 25 4
gpt4 key购买 nike

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

起初我认为这是由调用函数而不是使用内联代码引起的惰性求值问题,但在传递给 sprintf 的格式字符串上使用force() 并不能解决问题。我可以解决这个问题,但我想知道为什么会发生这种情况。当然,这可能是我忽略的一些微不足道的事情。

问。为什么 sprintf() 找不到字符串对象?

代码如下(针对更简单的示例进行了编辑和修剪)

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)

最佳答案

使用 Martin 的最小示例(这是一个最小示例,另请参阅 this question ),您可以通过指定环境 ggplot() 来使代码工作。应该使用。为此,指定参数 environmentggplot()函数,例如这样:

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

关于R:round()可以找到对象,sprintf()不能,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10681852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com