почему переименованная функция не работает как оригинальная функция в R - PullRequest
2 голосов
/ 25 сентября 2019

Я переименовываю функцию BASE R с именем factanal в efa, используя match.call.Но мне интересно, почему ТОЛЬКО при использовании формулы для аргумента x, efa выдает ошибку, которая: object 'n.obs' not found, но factanal работает нормально?

Примечание: при использовании data.frame для x, efa отлично работает.

efa <- function(x, factors, data = NULL, covmat = NULL, n.obs = NA,
            subset, na.action, start = NULL, center = FALSE,
            scores = c("none", "regression", "Bartlett"),
            rotation = "varimax", control = NULL, ...)
 {

 fit <- factanal(x, factors, data = data, covmat, n.obs = n.obs,
              subset, na.action, start = start,
              scores = scores,
              rotation = rotation, control = control, ...)

 fit$call <- match.call(expand.dots = FALSE)

 return(fit)
}

# Example of use:

v1 <- c(1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,4,5,6)
v2 <- c(1,2,1,1,1,1,2,1,2,1,3,4,3,3,3,4,6,5)
v3 <- c(3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,5,4,6)

factanal(~v1+v2+v3, factors = 1, data = data.frame(v1, v2, v3)) # Works fine
     efa(~v1+v2+v3, factors = 1, data = data.frame(v1, v2, v3)) # Error: object 'n.obs' not found

     efa(data.frame(v1, v2, v3), factors = 1) # Works fine

1 Ответ

2 голосов
/ 25 сентября 2019

Я думаю, что более распространенный способ сделать это - сначала захватить вызов, обернуть любой параметр, а затем оценить его.Примерно так:

efa <- function(x, factors, data = NULL, covmat = NULL, n.obs = NA,
                subset, na.action, start = NULL, center = FALSE,
                scores = c("none", "regression", "Bartlett"),
                rotation = "varimax", control = NULL, ...)
{

  cc <- match.call(expand.dots = FALSE)
  cc[[1]] <- quote(factanal)
  fit <- eval.parent(cc)
  fit$call <- match.call(expand.dots = FALSE)

  return(fit)
}

Мы можем протестировать с

efa(~v1+v2+v3, factors = 1, data = data.frame(v1, v2, v3))
# Call:
# efa(x = ~v1 + v2 + v3, factors = 1, data = data.frame(v1, v2,     v3))
# 
# Uniquenesses:
#    v1    v2    v3 
# 0.005 0.114 0.739 
# 
# Loadings:
#    Factor1
# v1 0.998  
# v2 0.941  
# v3 0.511  
# 
#                Factor1
# SS loadings      2.143
# Proportion Var   0.714
# 
# The degrees of freedom for the model is 0 and the fit was 0.0609 

Причина, по которой это не работает в противном случае, заключается в том, что когда вы передаете значение в n.obs, оно предполагаетэто имя переменной в вашем data.frame, которое содержит значение, которое вы хотите использовать, оно не предполагает, что это переменная в вашей текущей среде.

...