Получить объект и индексы от вызова поднабора
В принципе, я хотел бы создать функцию R separate_call
это получает аргумент как x[ind]
и возвращается x
а также ind
(так, из родительской среды):
x <- 1:10
ind <- 2:3
separate_call(x[ind]) ## should return `list(1:10, 2:3)`
Я знаю, что мне нужно использовать нестандартную оценку и некоторый синтаксический анализ дерева, но я недостаточно знаком с этими двумя понятиями. Любая помощь будет оценена.
2 ответа
Глядя на код pryr:::tree
и немного поэкспериментировав, я нашел решение:
separate_call <- function(call) {
call.sep <- as.list(substitute(call))
parent_env <- parent.frame()
x <- eval(call.sep[[2]], parent_env)
ind <- eval(call.sep[[3]], parent_env)
list(x, ind)
}
Проверка:
> x <- 1:10
> ind <- 2:3
> separate_call(x[ind])
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] 2 3
> separate_call(x[1:2])
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] 1 2
Я добавляю это решение, не очень элегантное, посмотрим, подходит ли оно вам.
separate_call <- function(m){
dprse <- deparse(substitute(m)) ##deparsing the data: to make it as string
lyst <- strsplit(dprse,"\\[|\\]")[[1]] ##removing the square brackets to sparate contents of m
lapply(lyst, function(y)eval(parse(text = y), envir = parent.frame()))
}
Я надеюсь, что это работает, я попробовал, называя это тремя различными способами
separate_call(1:10[ind])
separate_call(x[2:3])
separate_call(1:10[2:3])
Они все дали мне один и тот же ответ
> separate_call(1:10[ind])
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] 2 3
> separate_call(x[2:3])
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] 2 3
> separate_call(1:10[2:3])
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] 2 3