R: передать переменную lm внутри функции

Я хочу написать функцию, которая вызывает 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 внутри функции?


person rororo    schedule 09.12.2018    source источник
comment
Причина, по которой я не использую geom_smooth, заключается в том, что я хочу записать значение R2 и коэффициент в график. Я обновил свой вопрос.   -  person rororo    schedule 09.12.2018


Ответы (1)


Основная проблема в том, что вы пытаетесь использовать нестандартную оценку, а это может быть сложно. Будет проще, если вы просто поместите имена столбцов в кавычки, хотя это все еще немного сложно, потому что вам нужно создать формулу для отправки в lm(). Например, этот код работал бы, если бы n и o были строками с именами столбцов, а не с именами столбцов без кавычек:

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")
person user2554330    schedule 09.12.2018
comment
с subsitute я получаю error in as.name(n) : Object 'columna' not found - person rororo; 10.12.2018
comment
Я отредактировал ответ, чтобы показать, как нужно вызывать fun (). - person user2554330; 10.12.2018