Эмулировать динамический обзор в R для фильтрации по произвольным функциям - PullRequest
0 голосов
/ 11 октября 2019

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

Я думал, что мне нужно сделать это, чтобы создать функцию более высокого порядка, которая считывает файлыизвлекает интересующее свойство из каждого, а затем применяет условие (предоставляется в качестве аргумента в форме функции) поэлементно к результирующему вектору значений:

filter.by.property <- function(where, funct) {
  setwd(where)
  paths <- list.files(".", pattern = ".file")
  Robjects <- Map(read.file, paths)
  values <- sapply(Robjects, function(x) property_of_interest(x))
  passes <- Filter(funct, paths)
  dir.create("dir1")
  dir.create("dir2")
  file.copy(passes, paste("./dir1/", 1:length(passes), ".file", sep = ""))
  file.copy(paths[!paths %in% passes], paste("./dir2/", (length(passes) + 1):length(paths), ".file", sep = ""))
}

Проблема в том, что яхотел бы, чтобы определяющая условие функция (предоставленная в аргументе funct) имела доступ к вектору values. Например:

ten.biggest <- function(path) {
  Robject <- read.file(path)
  property_of_interest(x) %in% tail(sort(values), 10)
}

filter.by.property(<place>, ten.biggest)

Поскольку R имеет лексическую область видимости, он будет искать values в среде, где определено ten.biggest (глобальная среда), а не в среде, где он вызывается (т.е. внутри filter.by.property). Я мог бы решить эту проблему, используя глобальное присваивание для values внутри filter.by.property, но я бы предпочел этого не делать, если в этом нет крайней необходимости. Я мог бы также указать values в качестве еще одного аргумента для ten.biggest, но тогда функция больше не была бы унарной, и я не уверен, как (или даже нет) она все еще может использоваться внутри Filter.

Одним из решений, которое я попытался, было переписать ten.biggest следующим образом

ten.biggest <- function(path) {
  Robject <- read.file(path)
  property_of_interest(x) %in% tail(sort(eval.parent(parse(text = values))), 10)
}

, но это не сработало.

Есть ли способ эмулировать динамическую область видимости в R длясделать эту работу? Из прочтения связанных вопросов StackExchange кажется, что, возможно, функция body могла бы помочь, но я не знаю, как применить ее к моей проблеме.

...