19

のドキュメントにsapplyreplicate、使用に関する警告があります...

今はそのように受け入れることができますが、その背後にあるものを理解したいと思います. だから私はこの少し不自然な例を作成しました:

innerfunction<-function(x, extrapar1=0, extrapar2=extrapar1)
{
    cat("x:", x, ", xp1:", extrapar1, ", xp2:", extrapar2, "\n")
}

middlefunction<-function(x,...)
{
    innerfunction(x,...)
}

outerfunction<-function(x, ...)
{
    cat("Run middle function:\n")
    replicate(2, middlefunction(x,...))
    cat("Run inner function:\n")
    replicate(2, innerfunction(x,...))
}

outerfunction(1,2,3)
outerfunction(1,extrapar1=2,3)
outerfunction(1,extrapar1=2,extrapar2=3)

おそらく、私は明らかに恐ろしく間違ったことをしたのでしょうが、この結果はかなり動揺しています。outerfunction上記のすべての への呼び出しで、次の出力が得られる理由を誰でも説明できます。

Run middle function:
x: 1 , xp1: 0 , xp2: 0 
x: 1 , xp1: 0 , xp2: 0 
Run inner function:
x: 1 , xp1: 0 , xp2: 0 
x: 1 , xp1: 0 , xp2: 0

私が言ったように:ドキュメントはこれについて警告しているようですが、なぜそうなのかわかりません。

4

4 に答える 4

6

のコードを見るとreplicate

> replicate
function (n, expr, simplify = TRUE) 
sapply(integer(n), eval.parent(substitute(function(...) expr)), 
    simplify = simplify)
<environment: namespace:base>

関数が親フレームで評価され、...呼び出し元の関数が存在しないことがわかります。

于 2011-07-15T10:26:22.387 に答える
1

実際にこれを行う方法があります:

# Simple function:
ff <- function(a,b) print(a+b)

# This will NOT work:
testf <- function(...) {
  replicate(expr = ff(...), n = 5)
}
testf(45,56) # argument "b" is missing, with no default

# This will:
testf <- function(...) {
  args <- as.list(substitute(list(...)))[-1L]
  replicate(expr = do.call(ff, args), n = 5)
}
testf(45,56) # 101
于 2015-04-27T01:05:34.660 に答える