我刚看过hadley的文章:http://rpubs.com/hadley/97970真的很酷!
因为我想准备一些简单的功能。当我想创建一个图并使用另一个变量来区分所有对象时,我们通常使用color
或fill
参数。我总是有一个问题需要记住,我应该在散点图中使用color
参数,而在例如fill
中使用point <- function(data, x, y, color = NULL){
if (is.null(color)){
ggplot(data, aes_(x = substitute(x),y = substitute(y)))+
geom_point(color = 'red')
}
else{
ggplot(data, aes_(x = substitute(x),y = substitute(y),color = substitute(color)))+
geom_point()
}
}
箱形图。
因此,当我不使用颜色参数时,我想使用红色默认值:
point(mtcars, qsec, mpg)
在这种情况下,color
正常工作,但point(mtcars, qsec, mpg, factor(cyl))
参数功能根本不起作用 - textField:shouldChangeCharactersInRange:replacementString:
。为什么呢?
答案 0 :(得分:2)
您似乎对非标准评估存在问题。当您在is.null()
上运行color
时,您正在评估传递给该函数的承诺。然后,这会更改在变量上调用substitute()
的行为。您尝试使用substitute()
获得的行为依赖于传递未评估的承诺。例如
foo<-function(x=NULL) {
if(is.null(x)) {
"NOTPASSED"
} else {
substitute(x)
}
}
foo()
#[1] "NOTPASSED"
foo(ok)
# Error in foo(ok) : object 'ok' not found
is.null
发送R寻找找不到的名为ok
的变量。您希望能够仅提取变量的名称而不是值。
在这种情况下,您实际上只是检查缺少的参数。最好使用missing()
。与
foo<-function(x) {
if(missing(x)) {
"NOTPASSED"
} else {
substitute(x)
}
}
foo()
# [1] "NOTPASSED"
foo(ok)
# ok
missing()
函数不会尝试评估承诺。您可以根据自己的功能进行调整。它并非特定于ggplot
。