【问题标题】:Function argument to call only part of a column name (ggplot)仅调用列名的一部分的函数参数(ggplot)
【发布时间】:2018-04-23 19:08:20
【问题描述】:

我已经成功构建了我的第一个函数 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)

我希望函数执行与上面完全相同的操作,但我只想改为编写 compare(Y)。

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

y=c`VAR'

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

【问题讨论】:

    标签: r function ggplot2


    【解决方案1】:

    这个怎么样

    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)
    

    【讨论】:

    • 谢谢。我看到您还使用 stopifnot 功能进一步改进了该功能。这实际上非常有用:-)
    【解决方案2】:

    希望这是您想要的。我只是 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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 2016-06-15
      相关资源
      最近更新 更多