5

我有以下简单的功能,但它的 ggplot 命令不起作用。从命令行给出命令时,该命令可以正常工作:

> testfn <- function(gdf, first, second){          
   library(ggplot2) 
   print(ggplot(gdf, aes(first, second)) + geom_point()) 
}                                                                                              
>
> testfn(mydataf, vnum1, vnum2)   
    Error in eval(expr, envir, enclos) : object 'second' not found
> 
> ggplot(mydataf, aes(vnum1, vnum2)) + geom_point()

>  (plots graph without any error)

我尝试使用aes_string而不是aes; 并且还使用x=first, y=second. 事情有所改善,并且绘制了一个点!X 和 Y 轴显示与该点相关的数字作为标签。只有第一行被绘制。问题出在哪里。谢谢你的帮助。

4

2 回答 2

4

所以这个aes_string版本对我来说很好。

# set-up and sample data
library(ggplot2) 
set.seed(1)
mydataf <- data.frame(vnum1=rnorm(10), 
                      vnum2=rnorm(10))
# aes_string version called with characters
testfn <- function(gdf, first, second){            
  print(ggplot(gdf, aes_string(x=first, y=second)) + geom_point()) 
}                                                                                              
# aes_string version called with variables
testfn2 <- function(gdf, first, second){  
  print(ggplot(gdf, aes_string(x=deparse(substitute(first)), 
                               y=deparse(substitute(second)))) + 
          geom_point())
}     
# 3 times the same plot
ggplot(mydataf, aes(vnum1, vnum2)) + geom_point()
testfn(mydataf, "vnum1", "vnum2")   
testfn2(mydataf, vnum1, vnum2)   
于 2014-04-30T08:26:58.437 回答
4

(根据我最初的建议和您的确认)

这是关于您如何尝试将变量名的字符串参数传递到您的 fn.

  • 在命令行上,ggplot(gdf, aes(first, second))可以正常工作
  • 但在你的函数内部,你也传入 first,second 作为字符串变量。所以是的,你现在需要aes_string(first,second)在你的函数 testfn 中,因为你现在通过字符串变量第一个,第二个间接传递变量名。
  • 也因为变量名first,second是字符串,是的,当您调用 fn 时确实需要引用它们。(我不确定 ggplotaes()使用什么语言机制来不需要字符串,但无论如何。使用引号。)
  • 另请参阅quote()R 中的命令
于 2014-04-30T09:16:39.640 回答