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

R 函数参数仅调用列名的一部分(ggplot),r,function,ggplot2,R,Function,Ggplot2,我成功地建立了我的第一个功能I R。 我现在想改进它,但不知道如何改进 我的数据集包含许多变量,这些变量具有几乎相同名称的“镜像”变量。唯一的命名差异是“mirror”变量的名称前面有一个“c” 该函数绘制变量(VAR)与其“镜像”(cVAR)的比较图 复制挑战的简化数据集和简化函数代码: library(ggplot2) df <- data.frame( X = 1:10+rnorm(10,mean=1,sd=0.5), cX = 1:10+rnorm(10,mea

我成功地建立了我的第一个功能I R。 我现在想改进它,但不知道如何改进

我的数据集包含许多变量,这些变量具有几乎相同名称的“镜像”变量。唯一的命名差异是“mirror”变量的名称前面有一个“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)

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

希望这是您想要的。我只需使用定义的
myLetter
粘贴0
VAR
,并将
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")
比较这个怎么样

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)
}

非常感谢。我看到您还使用stopifnot函数进一步改进了该函数。这实际上非常有用:-)
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)
}
compare(Y) # to cY
compare(X) # to cX
compare(Y, cY)
compare(Y, cX)