我只是想知道一个简单的问题:
说我有以下功能,基本上是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?答案 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会对参数解释做一些疯狂的事情,所以有时很难。