R:将变量传递给lm内部函数

时间:2018-12-09 20:21:00

标签: r function ggplot2 lm rlang

我想编写一个调用lm并使用ggplot2用回归线绘制散点的函数。

来自here,这是我的代码:

fun <- function(m, n, o, p) {
  library(ggplot2)
  data <- as.data.frame(read.table(file = m, header = T, dec = ".", sep = "\t" ))
  fit <- lm(as.formula(n ~ 0 + o), data)
  text<-paste("R^2 = ", summary(fit)$adj*100, " %; coefficient = ", fit$coefficients, sep="")
  ggplot(data, aes(x=!!rlang::enquo(o), y = !!rlang::enquo(n))) + geom_point(aes(colour = !!rlang::enquo(p))) + geom_abline(intercept=0, slope=fit$coefficients[1], color='#2C3E50', size=1.1) + geom_text(aes(x = 1, y = 1, label = text))
}

示例输入文件:

columna columnb string
3338240000  97.65   ccc
3453970000  98.8    ccc
3559920000  99.5    aaa
1434400000  87.8    ccc
2953560000  99.8    ccc
3172212857  99.15   ccc
3286080000  99.3    ccc
3750630000  99.3    ccc
4215180000  99.7    ccc
2836200000  99.85   ccc
229830000   93.8    rrr
39120000    94.5    ppp
1770180000  99  ccc

当我使用调用该函数时

fun("input", columna, columnb, string)

我得到一个错误。如何将变量(列名)正确传递给函数内部的lm?

1 个答案:

答案 0 :(得分:1)

主要问题是您正在尝试使用非标准评估,这可能很棘手。如果只将列名放在引号中,则比较容易,尽管有些棘手,因为您需要创建公式以发送到lm()。例如,如果no是用字符串命名列而不是未引用的列名,则此代码将起作用:

fla <- substitute(n ~ 0 + o, list(n = as.name(n), o = as.name(o)))
fit <- lm(fla, data)

您还需要修改ggplot2调用。这似乎可行,但是我对ggplot2并不十分了解,是否知道这样做是否是“正确”的方法:

  ggplot(data, aes(x=data[[o]], y = data[[n]])) + 
    geom_point(aes(colour = data[[p]])) + 
    geom_abline(intercept=0, slope=fit$coefficients[1], color='#2C3E50', size=1.1) + 
    geom_text(aes(x = 1, y = 1, label = text)) +
    labs(x = o, y = n, color = p) 

进行了这些更改后,您应该可以使用带引号的名称来呼叫fun,例如

fun("input", "columna", "columnb", "string")