R语言自定义ggplot保存函数:无法识别name参数为字符串的问题
解决ggplot自定义保存函数的参数问题
咱们先把问题根源捋清楚:你写的saving_ggplot函数里,name参数原本是要接收字符串的,但你调用时传的weightvsageTEST没加引号,这时候R会把它当成一个对象去查找,而你根本没定义这个对象,自然就报出“object not found”的错误了。直接用ggsave时你加了引号传字符串,所以能正常运行。
给你两个实用方案,按需选择:
方案1:调用时给name参数加引号(最简单直接)
这是最贴合你原本函数设计的方式,调用时把文件名用引号括起来,当成字符串传入就行:
saving_ggplot("weightvsageTEST", weightvsageplot)
这样函数会直接把它识别为文件名,不会去查找同名对象。
方案2:修改函数,支持裸名传入(不用加引号)
如果你不想每次都加引号,可以修改函数,用deparse(substitute())捕获你传入的参数名称,把它转换成字符串。修改后的函数如下:
saving_ggplot <- function(name = 'default', plotname = last_plot()) { # 捕获传入的name表达式并转为字符串 name_str <- deparse(substitute(name)) # 处理用户已加引号的情况,去掉多余引号 if (startsWith(name_str, '"') && endsWith(name_str, '"')) { name_str <- substr(name_str, 2, nchar(name_str)-1) } image_name <- paste(name_str, ".png", sep = "") ggsave(image_name, plot = plotname, scale = 1, dpi = 300, limitsize = TRUE) }
现在不管你用saving_ggplot(weightvsageTEST, weightvsageplot)还是saving_ggplot("weightvsageTEST", weightvsageplot),函数都能正常生成对应的PNG文件。
为啥之前用as.character没用?因为当你传裸名时,R会先尝试查找这个对象,找不到直接就报错了,根本轮不到as.character去转换。而deparse(substitute())是在R求值参数之前,直接把你传入的“名称”转换成字符串,完美避开了查找对象的步骤。
内容的提问来源于stack exchange,提问作者Alexis Drakopoulos
相关产品推荐
相关产品推荐

