Простой поиск и замена каждого совпадения во вложенном списке

Возьмите этот объект в качестве примера:

expr <- substitute(mean(exp(sqrt(.)), .))

Это вложенный список. Я хочу найти все элементы, соответствующие quote(.).

Например, решение magrittr соответствует только первому уровню вызова:

dots <- c(FALSE, vapply(expr[-1], identical, quote(.), 
                        FUN.VALUE = logical(1)))
dots
[1] FALSE FALSE  TRUE

Но я хотел найти каждый "." в произвольном вложенном списке. В данном конкретном случае это будут две точки:

expr[[3]]
expr[[2]][[2]][[2]]

И тогда эти точки следует заменить:

expr[[3]] <- as.name("replacement")
expr[[2]][[2]][[2]] <- as.name("replacement")
expr
# mean(exp(sqrt(replacement)), replacement)

Как бы вы это сделали?


person Carlos Cinelli    schedule 02.10.2014    source источник


Ответы (1)


Использование рекурсивной функции:

convert.call <- function(x, replacement) {
  if (is.call(x)) as.call(lapply(x, convert.call, replacement=replacement)) else
    if (identical(x, quote(.))) as.name(replacement) else
      x
}

convert.call(expr, "x")
# mean(exp(sqrt(x)), x)
person flodel    schedule 02.10.2014