Получить объект и индексы от вызова поднабора - PullRequest
0 голосов
/ 02 июня 2018

По сути, я хотел бы создать функцию 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 ]

0 голосов
/ 02 июня 2018

Я добавляю это решение, не очень элегантное, посмотрите, подходит ли оно вам.

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
0 голосов
/ 02 июня 2018

Глядя на код 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
...