У меня есть функция, которая принимает фрейм данных и отображает несколько столбцов из этого фрейма данных с помощью ggplot2. Функция aes() в ggplot2 принимает аргумент метки, и я хочу использовать sprintf для форматирования этого аргумента - и это то, что я делал много раз раньше в другом коде. Когда я передаю строку формата sprintf (в данном случае «% 1.1f»), она говорит «объект не найден». Если я использую функцию round() и передаю аргумент этой функции, он может найти ее без проблем. То же самое касается формата(). По-видимому, только sprintf() не может видеть объект.R: round() может найти объект, sprintf() не может, почему?
Сначала я думал, что это была ленивая проблема оценки, вызванная вызовом функции, а не с использованием встроенного кода, но с использованием force() в строке формата, которую я передаю в sprintf, не решает проблему. Я могу обойти это, но я хотел бы знать, почему это происходит. Конечно, это может быть что-то тривиальное, что я забыл.
В. Почему 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)
вы можете сделать это минимальный пример? – baptiste
Ваш код не запускается в R 2.15. Я получаю «Ошибка в get (x, envir = this, inherits = inh) (это, ...): неиспользуемый аргумент (метки) (метки = функция (x) формат (х, формат), breaks = function (x) fullseq (x, width)) ' –
Спасибо @baptiste и Joris, рассмотрим обе проблемы как можно скорее. – SlowLearner