来自另一个环境的R函数参数

时间:2014-05-08 16:24:40

标签: r function environment

我只是想知道一个简单的问题:

说我有以下功能,基本上是SAS MACRO

e<-new.env()
e$graph<-function(a,b,c){
  e$plot<-ggplot()+
          geom_text(aes(label=a......))+
          geom_text(aes(label=b......))+
          geom_text(aes(label=c......))
}
e$graph(e$label_1,e$label_2,e$label_3)

我基本上使用此功能的方式与SAS MACRO的运行方式相同,所以我可以替换它在abc中的任何内容,并绘制另一个图形。

然而,R说缺少a,因为我在默认环境中调用a,但函数e $ graph()使用环境e中的参数。

你知道我该怎么办?也许只使用一个列表的参数,并在每个单元格中,为它分配e $ label_123?

1 个答案:

答案 0 :(得分:0)

您可以使用表达式和替换来替换变量,而不是使用环境。

考虑这个例子

runmacro<-function(expr, ...) {
    stopifnot(class(expr)=="expression")
    dots<-list(...)
    subexpr<-do.call(substitute, list(expr[[1]], dots))
    eval(subexpr)
}

#define macro
ex<-expression({
    print(paste("Hello",name,"value",x))
})

#run and swap variables
x<-15;
y<-20;
z<-"y";
runmacro(ex, name="David")
runmacro(ex, name="David", x=y)
runmacro(ex, name="David", x="y")
runmacro(ex, name="David", x=as.symbol(z))

在这里,我设置了一个辅助函数runmacro,它接受​​一个表达式,并将您命名为参数的任何值替换为相应的值。因此,通过传递name="David",我们将表达式中变量name的所有匹配项替换为"David"。您可以使用其他变量或其他值替换变量。每个例子都展示了不同的案例。

我会定义你的宏

pe<-expression({
    plot<-ggplot()+
        geom_text(aes(label=a))+
        geom_text(aes(label=b))+
        geom_text(aes(label=c))
})

在大多数情况下,R只是编写一个普通的包装函数会更好,但我会承认ggplot会对参数解释做一些疯狂的事情,所以有时很难。