Получить объект и индексы от вызова поднабора

В принципе, я хотел бы создать функцию 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
Другие вопросы по тегам