3

私は最初のパッケージを開発しており、Rを初めて使用するユーザーを対象としているため、パッケージを使用するために必要なRスキルの量を最小限に抑えるようにしています。結果として、パッケージ内の他の関数のデフォルトを変更する関数が必要です。しかし、「ロックされた環境にバインディングを追加できません」というエラーが発生します。これは、パッケージの環境がロックされており、その関数のデフォルト値を変更できないことを意味します。

同様のエラーをスローする例を次に示します。

library(ggplot2)
assign(formals(geom_point)$position, "somethingelse", pos="package:ggplot2")

私がassignInNamespaceを試してみると、次のようになります。bindingIsLocked(x、ns)のエラー:「ID」のバインディングがありません

assignInNamespace(formals(geom_point)$position,"somethingelse", pos = "package:ggplot2")

これが私が達成したいことの例です。

default <- function(x=c("A", "B", "C")){
       x
       }
default()

change.default <- function(x){
formals(default)$x <<- x        # Notice the global assign
}

change.default(1:3)
default()

これが推奨されるアプローチとはほど遠いことは承知していますが、パッケージの学習曲線を改善するために、手抜きをしたいと思っています。これを達成する方法はありますか?

この質問は、プロジェクト固有の基準で機能デフォルトRを設定する重複としてマークされています。この質問は、インタラクティブセッションのユーザーが関数のデフォルトを変更できるようにする方法に関するものであり、実際に行う方法ではないため、これは別の状況です。古い質問はoptions()関数では解決できなかったため、別の質問になります。

4

2 に答える 2

4

私はあなたが望むものを達成するための口語的な方法は経由optionであり、パッケージは実際にそうすることだと思います、例えばlattice(彼らは特別なオプションを使用しますが)またはascii

さらに、これはベースRでも行われます。たとえば、の有名で悪名高いデフォルトですstringsAsFactors

あなたが見る?read.tableか、?data.frameあなたが得るならば:stringsAsFactors = default.stringsAsFactors()。これを調べると、次のことがわかります。

> default.stringsAsFactors
function () 
{
    val <- getOption("stringsAsFactors")
    if (is.null(val)) 
        val <- TRUE
    if (!is.logical(val) || is.na(val) || length(val) != 1L) 
        stop("options(\"stringsAsFactors\") not set to TRUE or FALSE")
    val
}
<bytecode: 0x000000000b068478>
<environment: namespace:base>

ここでの関連部分はgetOption("stringsAsFactors")、以下を生成します。

> getOption("stringsAsFactors")
[1] TRUE

それを変更することは次のように達成されます:

> options(stringsAsFactors = FALSE)
> getOption("stringsAsFactors")
[1] FALSE

あなたが望むことをするためにあなたのパッケージはオプションを設定する必要があります、そして関数はオプションからその値を取ります。次に、別の関数でオプションを変更できます。

options(foo=c("A", "B", "C"))

default <- function(x=getOption("foo")){
    x
}
default()

change.default <- function(x){
    options(foo=x)
}

change.default(1:3)
default()

.onAttachロード時にパッケージでオプションを設定する場合は、でまたは.onLoad関数を作成する必要がありますzzz.R。私のafexパッケージは、例えば、これを行い、デフォルトのコントラストを変更します。あなたの場合、それは次のようになります:

.onAttach <- function(libname, pkgname) {
    options(foo=c("A", "B", "C"))
}

ascii.onLoad(正確な違いは覚えていませんが、R拡張機能を作成すると役立ちます)。

于 2013-03-17T13:59:44.123 に答える
3

好ましくは、関数は以下のものを有する:

  1. 入力引数
  2. それらの引数で何かをする関数本体
  3. 出力引数

したがって、関数の動作について何かを変更したい状況では、入力引数を最適な方法で変更します。たとえば、別の投稿に対する私の回答を参照してください。

を使用しoptionて、いくつかのグローバル設定(たとえば、使用するフォント、使用するパッケージが保存されているPATH)を保存することもできます。上記のリンクした質問の@Jamesの回答を参照してください。ただし、コードが読みにくくなるため、これらは慎重に使用してください。私は主にそれらを読み取り専用で使用します。つまり、(パッケージまたはユーザーのいずれかによって)一度設定し、関数がそれらを変更できないようにします。

読みにくいのは、関数の動作がローカルで(つまり、関数を直接操作するコードによって)決定されるだけでなく、遠く離れた設定によっても決定されるという事実に起因します。これにより、関数を呼び出すコードを純粋に見て、関数が何をするかを判断するのが難しくなりますが、何が起こっているのかを完全に理解するには、さらに多くのコードを掘り下げる必要があります。さらに、他の関数がこれらのオプションを変更した場合、関数の履歴に依存するため、特定の関数が何を実行するかを予測するのがさらに難しくなります。そして、ここに、読み取り専用オプションに関する私の以前の推奨事項が復活しました。これらが読み取り専用である場合、読みやすさに関する問題のいくつかが軽減されます。

于 2013-03-17T13:41:32.820 に答える