如何编写一个将 NULL 传递给 ggplot 而不会出现美学错误的函数
How to write a function that passes NULL to ggplot without getting aesthetics error
我正在尝试编写一个创建绘图的函数,然后 运行 出现一个我不理解的错误。这是一个简化的例子。
可重现的例子:
library (ggplot2)
# Sample data
xdata = 0:20
ydata = 20:40
dat <- data.frame(xdata, ydata)
# This works
line_p <- ggplot(dat, aes(x = xdata, y = ydata, group = NULL, color = NULL)) + geom_line()
line_p
我希望下面的代码能工作,但出现了美学错误,但在这种情况下,x 和 y 变量的长度相同。问题似乎是组和颜色的默认值为 NULL。我尝试显式传递 NULL 以及 aes_group 和 aes_color 作为函数变量,但这也没有用。
# Using a function doesn't work:
# create function
line_function <- function(mydata = dat,
xinput = x,
yinput = y,
aes_group = NULL,
aes_color = NULL,
...) {
lineplot <- ggplot(dat, aes(x = xinput, y = yinput, group = aes_group, color = aes_color)) + geom_line()
}
# test the function
line_test_p <- line_function(
mydata = dat,
xinput = xdata,
yinput = ydata
)
line_test_p
使用显式输入进行测试
# test the function again with explicit NULL inputs
line_test2_p <- line_function(
mydata = dat,
xinput = xdata,
yinput = ydata,
aes_group = NULL,
aes_color = NULL
)
line_test2_p
是否无法编写一个通用函数,其中 ggplot 将解释 NULL 值,就像在没有函数的情况下工作的示例一样,或者我是否遗漏了其他东西?
谢谢!
简而言之,您应该查看 aes_string
以编程方式创建美学映射。它允许您使用存储字符串的变量名称创建美学映射。这样,很容易将列名作为参数传递给函数并创建相应的图。
你的函数的以下版本对我有用:
# create function
line_function <- function(mydata = dat,
xinput = "x", # note the defaults are
yinput = "y", # strings here
aes_group = NULL,
aes_color = NULL,
...) {
ggplot(mydata, # this should be the argument, not the global variable dat
# now we create the aes binding with aes_string
aes_string(x = xinput,
y = yinput,
group = aes_group,
color = aes_color)) +
geom_line()
}
现在您可以使用函数来创建示例了:
# test the function
line_test_p <- line_function(
mydata = dat,
xinput = "xdata", # note the strings
yinput = "ydata"
)
# test the function again with explicit NULL inputs
line_test2_p <- line_function(mydata = dat,
xinput = "xdata", # and strings here
yinput = "ydata",
aes_group = NULL,
aes_color = NULL)
事情应该适合你。同样,请查看 documentation,因为有不同的方法可以完成此操作,并且您可能会根据不同的目的或偏好选择不同的方法。
我正在尝试编写一个创建绘图的函数,然后 运行 出现一个我不理解的错误。这是一个简化的例子。
可重现的例子:
library (ggplot2)
# Sample data
xdata = 0:20
ydata = 20:40
dat <- data.frame(xdata, ydata)
# This works
line_p <- ggplot(dat, aes(x = xdata, y = ydata, group = NULL, color = NULL)) + geom_line()
line_p
我希望下面的代码能工作,但出现了美学错误,但在这种情况下,x 和 y 变量的长度相同。问题似乎是组和颜色的默认值为 NULL。我尝试显式传递 NULL 以及 aes_group 和 aes_color 作为函数变量,但这也没有用。
# Using a function doesn't work:
# create function
line_function <- function(mydata = dat,
xinput = x,
yinput = y,
aes_group = NULL,
aes_color = NULL,
...) {
lineplot <- ggplot(dat, aes(x = xinput, y = yinput, group = aes_group, color = aes_color)) + geom_line()
}
# test the function
line_test_p <- line_function(
mydata = dat,
xinput = xdata,
yinput = ydata
)
line_test_p
使用显式输入进行测试
# test the function again with explicit NULL inputs
line_test2_p <- line_function(
mydata = dat,
xinput = xdata,
yinput = ydata,
aes_group = NULL,
aes_color = NULL
)
line_test2_p
是否无法编写一个通用函数,其中 ggplot 将解释 NULL 值,就像在没有函数的情况下工作的示例一样,或者我是否遗漏了其他东西?
谢谢!
简而言之,您应该查看 aes_string
以编程方式创建美学映射。它允许您使用存储字符串的变量名称创建美学映射。这样,很容易将列名作为参数传递给函数并创建相应的图。
你的函数的以下版本对我有用:
# create function
line_function <- function(mydata = dat,
xinput = "x", # note the defaults are
yinput = "y", # strings here
aes_group = NULL,
aes_color = NULL,
...) {
ggplot(mydata, # this should be the argument, not the global variable dat
# now we create the aes binding with aes_string
aes_string(x = xinput,
y = yinput,
group = aes_group,
color = aes_color)) +
geom_line()
}
现在您可以使用函数来创建示例了:
# test the function
line_test_p <- line_function(
mydata = dat,
xinput = "xdata", # note the strings
yinput = "ydata"
)
# test the function again with explicit NULL inputs
line_test2_p <- line_function(mydata = dat,
xinput = "xdata", # and strings here
yinput = "ydata",
aes_group = NULL,
aes_color = NULL)
事情应该适合你。同样,请查看 documentation,因为有不同的方法可以完成此操作,并且您可能会根据不同的目的或偏好选择不同的方法。