У меня есть несколько файлов в каталоге, и я хочу распределить их между двумя вновь созданными подкаталогами в зависимости от того, удовлетворяет ли их содержимое определенному условию. Более того, мне нужно выполнить эту операцию для нескольких каталогов, и каждый раз условие может быть разным.
Я думал, что мне нужно сделать это, чтобы создать функцию более высокого порядка, которая считывает файлыизвлекает интересующее свойство из каждого, а затем применяет условие (предоставляется в качестве аргумента в форме функции) поэлементно к результирующему вектору значений:
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
могла бы помочь, но я не знаю, как применить ее к моей проблеме.