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))

#編集(@ 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))))
}
4

5 に答える 5

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)ます。tagここではasを指定できないので、単一の要素でvリストを作成し、ループ内でこのリストのnames属性を be に変更します。次に、この引数リストを使用して呼び出すように調整します。ll"Dunnett"vdo.call()mcp()

そして、完全を期すために、上記のコメントで@Joshが言及しているように、@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)))))
}
于 2012-11-06T16:31:13.887 に答える
3

質問のタイトルと最初の行を額面どおりに取りformals()、関数名または引数を変更する必要があるかどうかに応じて、関数をコピーおよび/または使用してみませんか?

最初のものについて:

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

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

2つ目は

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

> args(F)
function (y = A) 
NULL
于 2012-11-06T15:13:39.787 に答える
2

提供された引数の名前を動的に変更する必要がある場合は、次のようにすることができます。

cl <- quote(F(x = a))
names(cl)[names(cl) == "x"] <- "y"
cl
# F(y = a)
于 2012-11-06T15:11:56.967 に答える
1

あなたが実際に行っていることの例を見た後、あなたはまたparsesprintf

 print(eval(parse(text=sprintf("summary(glht(fit,linfct= mcp(%s='Dunnett')))",
   v))))
于 2012-11-06T16:16:39.237 に答える
1

リクエストに応じて、コメントは回答に移動しました:

私もしません。あなたが本当にやりたいことは何ですか?通常、R では、foo<- 'G'; bar<-'x' ; do.call(foo,bar)文字列オブジェクトに基づいて関数とその引数を選択することがあります。

于 2012-11-06T16:18:14.953 に答える