我是R的新手,刚学会编写简单的函数.有人可以帮助我理解为什么以下功能不起作用.
fboxplot <- function(mydataframe, varx, vary)
{
p <- ggplot(data=mydataframe, aes(x=varx, y=vary))
p + geom_boxplot()
}
col1 = factor(rep(1:3, 3))
col2 = rnorm(9)
col3 = c(rep(10,5), rep(20,4))
df = data.frame(col1 = col1, col2 = col2, col3 = col3)
Run Code Online (Sandbox Code Playgroud)
现在,如果我调用fboxplot函数
fboxplot(df, col1, col2)
Run Code Online (Sandbox Code Playgroud)
我收到了错误Error in eval(expr, envir, enclos): object varx not found.我也试过了
fboxplot(df, varx = col1, vary = col2)
Run Code Online (Sandbox Code Playgroud)
这给出了同样的错误.我哪里错了?
谢谢你的帮助.
aesggplot2中的函数使用类似library()的名称,即它将参数的名称作为参数.如果这是一个对象,它不会对它进行评估,而是采用名称.这里它varx作为参数而不是varx评估的内容.
如果您aes_string()改为使用并在fboxplot()调用中使用字符作为参数,则它可以工作:
fboxplot <- function(mydataframe, varx, vary)
{
p <- ggplot(data=mydataframe, aes_string(x=varx, y=vary))
p + geom_boxplot()
}
col1 = factor(rep(1:3, 3))
col2 = rnorm(9)
col3 = c(rep(10,5), rep(20,4))
df = data.frame(col1 = col1, col2 = col2, col3 = col3)
fboxplot(df, "col1", "col2")
Run Code Online (Sandbox Code Playgroud)
问题是你正在传递varx和vary向量,而aes函数需要变量名(但不是字符串).解决此问题的一种方法是使用aes_string可以将变量名称作为字符串传递的函数(但仍然不是向量):
以下应该有效:
fboxplot2 <- function(mydataframe, varx, vary) {
p <- ggplot(data=mydataframe, aes_string(x=varx, y=vary))
p + geom_boxplot() }
fboxplot2(df, "col1", "col2")
Run Code Online (Sandbox Code Playgroud)