函数参数只调用列名的一部分(ggplot)

时间:2017-11-10 14:14:22

标签: r function ggplot2

我已经成功构建了我的第一个函数i R. 我现在想改进它,但不知道如何。

我的数据集包含许多具有“镜像”变量的变量,这些变量具有几乎相同的名称。唯一的命名区别是“镜像”变量在名称前面有一个“c”。

该函数绘制了一个变量(VAR)和它的“镜像”(cVAR)的比较。

简化数据集和简化的功能代码,可以再现挑战:

library(ggplot2)  
df <- data.frame(
    X = 1:10+rnorm(10,mean=1,sd=0.5),
    cX = 1:10+rnorm(10,mean=1,sd=0.5),
    Y = 1:10+rnorm(10,mean=1,sd=0.5),
    cY = 1:10-rnorm(10,mean=1,sd=0.5))


compare <- function(VAR, cVAR) {
  VAR <- deparse(substitute(VAR))
  cVAR <- deparse(substitute(cVAR))

  ggplot(df, aes_string(x=VAR, y=cVAR))+
    geom_point()+
    geom_smooth(method="lm")+
    geom_abline(intercept = 0, slope = 1)
}

compare(Y, cY)

我希望该函数与上面的函数完全相同,但我只想写比较(Y)。

在STATA我会尝试这样的事情:

y=c`VAR'

但我在R中找不到类似的方法。

2 个答案:

答案 0 :(得分:2)

这个怎么样

compare <- function(VAR, cVAR) {
  VAR <- deparse(substitute(VAR))
  cVAR <- if(missing(cVAR)) {
    paste0("c", VAR)
  } else {
    deparse(substitute(cVAR))
  }

  stopifnot(all(c(VAR, cVAR) %in% names(df)))

  ggplot(df, aes_string(x=VAR, y=cVAR))+
    geom_point()+
    geom_smooth(method="lm")+
    geom_abline(intercept = 0, slope = 1)
}

基本上我们只是在未指定第二个参数时使用paste0()将“c”添加到第一个参数。

然后你可以运行其中任何一个

compare(Y) # to cY
compare(X) # to cX
compare(Y, cY)
compare(Y, cX)

答案 1 :(得分:1)

希望这是你想要的。我只是paste0 VAR定义了myLetter并将VAR作为字符传递给compare()

compare <- function(VAR, myLetter = "c") {
    library(ggplot2)
    VAR2 <- paste0(myLetter, VAR)

    ggplot(df, aes_string(VAR, VAR2))+
        geom_point() +
        geom_smooth(method = "lm")+
        geom_abline(intercept = 0, slope = 1)
}
compare("Y")

enter image description here