2017-10-27 4 views
1

call()関数と名前空間アドレス演算子::および:::を併用することに問題があります。何らかの理由で名前空間アドレス(::または:: :)でcall()を使用

> call("base::print", "Hi there") 
`base::print`("Hi there") 
> eval(call("base::print", "Hi there")) 
Error in `base::print`("Hi there") : 
could not find function "base::print" 

を、それが非含まれているためかcall()は(関数名の周りバッククォートを追加します。この愚かな例が示すようcall()ために供給されるだけで、関数名にそれを追加すると、コールが評価されたエラーを生成します - 標準的な文字)、これはすべてを台無しにするようです。 「アドレス」を省略するとどうなりますか:

> call("print", "Hi there") 
print("Hi there") 
> eval(call("print", "Hi there")) 
[1] "Hi there" 

この問題を解決する方法については、何かお勧めします。ただし、私はcall()でコードを生成する必要があります。これは、rmarkdownコードチャンクのコードを自動生成しています。私が本当に残したいと思うパッケージから、アンエクスポートされた関数を使用しているので、名前空間を指定できる必要があります。未記入

読んでいただきありがとうございます!


アップデート:私は(私は以下のステファン・ローランのそれ以外の場合は偉大な答えを読むことによってを意識するようになりました)私が探しています解決策の別のプロパティを言及するのを怠っ:関数定義がない場合、私は解決策を探していますコールにコピーされます。これは、get()を使用してソリューションを除外すると信じています。私が避けようとしている例として、qplot()ggplot2に電話したいとします。たとえば、 getFromNamespace()コールは、(それが簡単に読むことを作るために省略した出力の中央部分で)次のようになります。私たちが代わりにas.call(list(ggplot2::qplot, 1:10))を使用する場合

> as.call(list(getFromNamespace("qplot", "ggplot2"), 1:10)) 

    (function (x, y = NULL, ..., data, facets = NULL, margins = FALSE, 
    geom = "auto", xlim = c(NA, NA), ylim = c(NA, NA), log = "", 
    main = NULL, xlab = deparse(substitute(x)), ylab = deparse(substitute(y)), 
asp = NA, stat = NULL, position = NULL) 
{ 
    if (!missing(stat)) 
     warning("`stat` is deprecated", call. = FALSE) 
    if (!missing(position)) 
     warning("`position` is deprecated", call. = FALSE) 
    if (!is.character(geom)) 
     stop("`geom` must be a character vector", call. = FALSE) 
    argnames <- names(as.list(match.call(expand.dots = FALSE)[-1])) 
    arguments <- as.list(match.call()[-1]) 
    env <- parent.frame() 

#### A lot more code defining the function (omitted)##### 

    if (!missing(xlim)) 
     p <- p + xlim(xlim) 
    if (!missing(ylim)) 
     p <- p + ylim(ylim) 
    p 
})(1:10) 

同じことが起こります。

私が探しているのは、電話ggplot2::qplot(1:10)を生成するものです。それは、このソリューションが動作する理由で最も経験豊富なRのユーザーには自明だが

答えて

1

たぶん

> eval(as.call(list(getFromNamespace("print", "base"), "Hi there"))) 
[1] "Hi there" 
+1

、それから学ぶため、経験の少ないユーザーのために何が起こっているの簡単な説明を含めるのはいいかもしれません。 –

+0

ありがとう、私は 'getFromNamespace()'を知らなかった。これはうまくいきますが、呼び出しは関数定義にコピーされます。これを避けることができるかどうか知っていますか?私のセットアップでは、このコピーはコードの余分な行がたくさんあることを意味します。同じrmarkdown文書で100回。 – AHP

+0

@AHP分かりません。実際には、 'eval(as.call(list :: base :: print、"こんにちは ")))'を実行することもできます。 –

関連する問題