How to expand an ellipsis (…) argument without evaluating it in R

别说谁变了你拦得住时间么 提交于 2019-12-17 19:44:26

问题


I need a function that accepts an arbitrary number of arguments and stores them in a variable as an expression without evaluating them. I managed to do it with match.call but it seems a little "kludgy".

foo <- function(...) {
  expr <- match.call()
  expr[[1]] <- expression
  expr <- eval(expr)
  # do some stuff with expr
  return(expr)
}

> bla
Error: object 'bla' not found
> foo(x=bla, y=2)
expression(x = bla, y = 2)

Clarification

To clarify, I'm asking how to write a function that behaves like expression(). I can't use expression() directly for reasons that are too long to explain.


回答1:


The most idiomatic way is:

f <- function(x, y, ...) {
  match.call(expand.dots = FALSE)$`...`
}



回答2:


Using . from plyr as a prototype

foo <-   function (...) 
  {
  as.expression(as.list(match.call()[-1]))
  }



回答3:


The ultimate intended outcome is slightly vague (could you clarify a bit?). However, this may be helpful:

foo2 <- function(...) {
  expr <- as.list(substitute(list(...)))[-1L]
  class(expr) <- "expression"
  expr
}

example:

foo2(x=bla, y=2)
# expression(x = bla, y = 2)


来源:https://stackoverflow.com/questions/13353847/how-to-expand-an-ellipsis-argument-without-evaluating-it-in-r

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!