Передача аргумента данных в пользовательские функции R - PullRequest
0 голосов
/ 10 февраля 2020

Для таких функций, как lm() в R, вы передаете аргумент «data» в функцию, обычно это фрейм данных, а затем R знает все столбцы по имени, а не ссылается на них. Таким образом, разница составляет x=column вместо ссылки в моде x=df$column. Итак, как я могу использовать этот же метод в моих собственных пользовательских функциях?

Простой пример:

library(tidyverse)

df <- tibble(x=1:100,y=x*(1+rnorm(n=100)))

test_corr <- function(x,y) {
  cor(x,y) %>% return()
}

# Right now I would do this
test_corr(df$x,df$y)

# I want to be able to do this
test_corr(data=df, x, y)

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Так как вы используете tidyverse функции, имеет смысл использовать аккуратную оценку для этого типа задач. Для этой функции вы можете сделать

test_corr <- function(data, x, y) {
  quo( cor({{x}}, {{y}}) ) %>% 
    rlang::eval_tidy(data=data)
}

test_corr(df, x, y)

Сначала мы создадим условие для построения выражения, которое вы хотите оценить, и используем синтаксис {{ }} (embrace) для вставки имен переменных, которые вы передаете в функцию. в выражение. Затем мы оцениваем это предложение в контексте data.frame, который вы предоставляете с eval_tidy.

. Возможно, вас также заинтересует виньетка пакета tidyselect , в которой обсуждаются дополнительные параметры.

0 голосов
/ 10 февраля 2020

Вы можете использовать reformulate

apply_fun <- function(response, terms, data) {
   lm(reformulate(terms, response), data)
}

apply_fun("mpg", "cyl", mtcars)
#Call:
#lm(formula = reformulate(terms, response), data = data)

#Coefficients:
#(Intercept)          cyl  
#     37.885       -2.876  

apply_fun("mpg", c("cyl", "am"), mtcars)

#Call:
#lm(formula = reformulate(terms, response), data = data)

#Coefficients:
#(Intercept)          cyl           am  
#     34.522       -2.501        2.567  
...