2012-11-06 55 views
2

如何更改函数参数名称。对于使用替代品的例子,我可以改变函数的参数值或函数名称:更改函数参数名称

substitute(quote(F(x= A)), list(A= quote(B), F= quote(G))) 
## result 
quote(G(x = B)) 

但这不起作用:

substitute(quote(F(x= A)), list(x= quote(y))) 
## result 
quote(F(x = A)) 

# EDIT(@Joran这里是真实的例子,也许不那么真实但非常接近,我在做什么)

library("multcomp") 
data("mtcars") 

mtcars$gear <- factor(mtcars$gear) 
mtcars$cyl <- factor(mtcars$cyl) 
xv <- c("gear","cyl") 

for(v in xv){ 
fo <- as.formula(paste("mpg",v,sep="~")) 
fit <- lm(fo,data=mtcars) 
print(eval(substitute(summary(glht(fit,linfct= mcp(vn="Dunnett"))),list(vn=v)))) 
} 
+3

我不会做任何。你真的想做什么?通常在R中,你可能会做'foo < - 'G'; bar < - 'x'; do.call(foo,bar)'选择一个函数及其基于字符串对象的参数。 –

+3

你真的想要做什么? – joran

+1

@ Carl&Joran说了什么(“你真的想做什么?!”)。我会通过'formals()'自己改变参数... –

回答

4

以你的类似实际问题的一些例子,为什么不能做到这一点:

library("multcomp") 
data("mtcars") 

mtcars$gear <- factor(mtcars$gear) 
mtcars$cyl <- factor(mtcars$cyl) 
xv <- c("gear","cyl") 

ll <- list("Dunnett") 
for(v in xv){ 
    fo <- as.formula(paste("mpg",v,sep="~")) 
    fit <- lm(fo,data=mtcars) 
    names(ll) <- v 
    print(summary(glht(fit, linfct = do.call(mcp, ll)))) 
} 

其中给出:

 Simultaneous Tests for General Linear Hypotheses 

Multiple Comparisons of Means: Dunnett Contrasts 


Fit: lm(formula = fo, data = mtcars) 

Linear Hypotheses: 
      Estimate Std. Error t value Pr(>|t|)  
4 - 3 == 0 8.427  1.823 4.621 0.000144 *** 
5 - 3 == 0 5.273  2.431 2.169 0.072493 . 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
(Adjusted p values reported -- single-step method) 


    Simultaneous Tests for General Linear Hypotheses 

Multiple Comparisons of Means: Dunnett Contrasts 


Fit: lm(formula = fo, data = mtcars) 

Linear Hypotheses: 
      Estimate Std. Error t value Pr(>|t|)  
6 - 4 == 0 -6.921  1.558 -4.441 0.000235 *** 
8 - 4 == 0 -11.564  1.299 -8.905 1.71e-09 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
(Adjusted p values reported -- single-step method) 

这里的技巧是要注意的是,第一个参数mcp...这通常意味着我们可以通过表单list(tag = value)的列表。我们无法在此处指定tagv,因此只需使用单个元素"Dunnett"创建列表ll,然后将该列表中的名称的属性更改为v即可。然后使用do.call()安排使用此参数列表调用mcp()

以及物品是否完整,从@Hadley列表@Josh metions上述评论,从这个answer可以使用setNames()功能更简洁指出:

for(v in xv){ 
    fo <- as.formula(paste("mpg",v,sep="~")) 
    fit <- lm(fo,data=mtcars) 
    print(summary(glht(fit, linfct = do.call(mcp, setNames(list("Dunnett"), v))))) 
} 
+0

它可以缩写为:print(summary(glht(fit,linfct = setNames(eval mcp(vn =“Dunnett”)),v))))。 –

2

如果您必须动态地改变所提供的参数的名称,你可以做这样的事情:

cl <- quote(F(x = a)) 
names(cl)[names(cl) == "x"] <- "y" 
cl 
# F(y = a) 
3

按面值以你的问题的标题和第一线为什么不能复制的功能和/或取决于函数名称还是参数需要更改,使用formals()

对于第一种:

F <- function(x = A) {} 
G <- F 
formals(G) <- alist(x = B) 

> args(G) 
function (x = B) 
NULL 

对于第二个

F <- function(x = A) {} 
formals(F) <- alist(y = A) 

> args(F) 
function (y = A) 
NULL 
1

看到的你真的做什么的例子之后,你也可以使用parsesprintf

print(eval(parse(text=sprintf("summary(glht(fit,linfct= mcp(%s='Dunnett')))", 
    v)))) 
+1

我尝试听取Thomas Lumley在这方面的建议。 '需要( “命运”);幸运(106)'。 –

+0

@GavinSimpson,但问题不是我的! (+1对你的答案) – BenBarnes

+1

/我检查自己的代码为'parse' ... – BenBarnes

1

根据要求,评论转移到答案:

我也不会这样做。你真的想做什么?通常在R中,您可以使用foo<- 'G'; bar<-'x' ; do.call(foo,bar)来选择基于字符串对象的函数及其参数。

+0

+1用于提示do.call –