R:在函数内部将变量传递给 lm
R: pass variable to lm inside function
我想编写一个调用 lm
的函数,并使用 ggplot2
.
绘制带有回归线的散点图
来自,这是我的代码:
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?
主要问题是您正在尝试使用非标准评估,这可能很棘手。如果您只是将列名放在引号中会更容易,尽管仍然有点棘手,因为您需要创建要发送到 lm()
的公式。例如,如果 n
和 o
是命名列的字符串而不是不带引号的列名称,则此代码将起作用:
fla <- substitute(n ~ 0 + o, list(n = as.name(n), o = as.name(o)))
fit <- lm(fla, data)
您还需要修改 ggplot2
调用。这似乎可行,但我对 ggplot2
的了解还不够,无法确定这是否是 "right" 的方法:
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")
我想编写一个调用 lm
的函数,并使用 ggplot2
.
来自
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?
主要问题是您正在尝试使用非标准评估,这可能很棘手。如果您只是将列名放在引号中会更容易,尽管仍然有点棘手,因为您需要创建要发送到 lm()
的公式。例如,如果 n
和 o
是命名列的字符串而不是不带引号的列名称,则此代码将起作用:
fla <- substitute(n ~ 0 + o, list(n = as.name(n), o = as.name(o)))
fit <- lm(fla, data)
您还需要修改 ggplot2
调用。这似乎可行,但我对 ggplot2
的了解还不够,无法确定这是否是 "right" 的方法:
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")