R 更改函数参数名称

R 更改函数参数名称,r,R,如何更改函数参数名称。例如,使用替换,我可以更改函数参数值或函数名称: 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)) # 编辑(@Joran这里是一个真实的例子,可能不太真实,但非常接近我正在做的事情) # 库(

如何更改函数参数名称。例如,使用替换,我可以更改函数参数值或函数名称:

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))
# 编辑(@Joran这里是一个真实的例子,可能不太真实,但非常接近我正在做的事情)

#

库(“multcomp”)
数据(“mtcars”)

mtcars$gear如果必须动态更改所提供参数的名称,可以执行以下操作:

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

cl根据函数名或参数是否需要更改,将你的问题标题和第一行记在面值上,为什么不复制函数和/或使用
formals()

对于第一个:

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

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

F在看到您真正正在做的示例后,您还可以使用
parse
sprintf

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

应要求,将评论移至回答:


我也不会这么做。你到底想做什么?通常,在R中,您可能会执行
foo以您的示例为例执行类似于实际问题的操作,为什么不执行此操作:

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))))
}
这里的诀窍是要注意,
mcp
的第一个参数是
,这通常意味着我们可以传入一个表单列表
list(tag=value)
。我们不能在这里将
标记
指定为
v
,因此只需使用单个元素
“Dunnett”
创建列表
ll
,然后将循环中该列表的name属性更改为
v
。然后使用
do.call()
安排使用此参数列表调用
mcp()

为了完整起见,正如@Josh metions在上面的评论中所说的那样,从@Hadley的这篇文章中,可以使用
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)))))
}
for(v在xv中){

fo我也不会。你真正想做什么?通常在R中,你可能会做
foo你真正想做什么?@Carl&Joran说(“你真正想做什么?!”)。我会通过
formals()更改参数
我自己…@Carl Witthoft你能写下你的答案吗?我想你可能在和multcomp做点什么。看看哈德利或我的答案,这基本上和你自己的答案一样。在这方面我尽量听从托马斯·卢姆利的建议。
需要(“财富”);财富(106)
@GavinSimpson,但问题不是我的!(+1表示两个答案)可以缩短为:打印(摘要(glht(fit,linfct=setNames)(eval(mcp(vn=“Dunnett”)),v)))。
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)
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)))))
}