Использование `subset ()` во вторичной R-функции - PullRequest
1 голос
/ 23 июня 2019

По запросу функция foo1 может subset список by желаемой переменной (например, by = ESL == 1). В противном случае foo1 просто выведет сам введенный список.

Для моих целей мне нужно использовать foo1 в новой функции под названием foo2. НО Мне интересно, почему foo2 не работает и как это исправить:

Error in eval(e, x, parent.frame()) : object 'ESL' not found

Полные воспроизводимые данные и код приведены ниже:

foo1 <- function(by, data){

L <- split(data, data$study.name) ; L[[1]] <- NULL

 if(!missing(by)){

 s <- substitute(by)    

 H <- lapply(L, function(x) do.call("subset", list(x, s)))

 L <- Filter(nrow, H)
   }
return(L)
}

## EXAMPLE OF USE:
D <- read.csv("https://raw.githubusercontent.com/izeh/i/master/k.csv", h = T) ## Data

foo1(data = D, by = ESL == 1) ## works fine :-) @@@@

## BUT:
foo2 <- function(by, data){

  foo1(by = by, data = data)
}

## EXAMPLE OF USE:
foo2(data = D, by = ESL == 1) ## Fails :-( @@@@

1 Ответ

1 голос
/ 24 июня 2019

Здесь мы можем изменить foo2 на eval luate вызова функции

foo2 <- function(by, data){ 

  eval(substitute(foo1(by = by, data = data)))
 }

out1 <- foo1(data = D, by = ESL == 1) 
out2 <- foo2(data = D, by = ESL == 1) 
identical(out1, out2)
#[1] TRUE
...