3

関数の本体内で関数の引数を連結して、ボード内でさらに評価しようとしています。問題を解決するために多くのコードの改善を行いましたが、できませんでした。

Example:のような関数呼び出しを提供する場合、、に入力した文字とyに入力した文字を貼り付けて、分析用のデータセット内のフィールドを呼び出すこと fun(x,y)ができるようにしたいと思います。したがって、引数と引数に文字を指定すると、関数の本体内で使用する変数名を取得できます。x$carxtoyotaycar$toyota

私は試した:

gtData <- function(data,field,k)
d <- diff(data$field)  ## I also tried sum(data$field) to eliminate issues with diff()

しかし、##とd評価されました。コードを実行すると正しい答えが得られる0 からではないことがわかります。diff(car$toyota)私はそれが私がしたいことをしているとは思わない。また、次のように本文内に引数を貼り付けようとしました。

gtData(data,field,k)
a <- paste(data,"$",field)

toyotaトヨタはデータセットではなく、データセット内のフィールドであるため、存在しないと文句を言いました。

他の多くのバリエーションを試しpaste()ましたが、ここでやりたいことができないようです。

私が取得しようとしているのは文字列ですcar$toyota。これにより、さらに評価するための変数として、文字列を本体のさらに下に渡すことができます。

4

2 に答える 2

8

覚えておくとよいfortune(312)

The problem here is that the $ notation is a magical shortcut and like any other magic if used incorrectly
is likely to do the programmatic equivalent of turning yourself into a toad.
   -- Greg Snow (in response to a user that wanted to access a column whose name is stored in y via x$y
      rather than x[[y]])
      R-help (February 2012)

あなたが欲しいの[[$

gtData <- function(data,field,k){
  a <- data[[field]]
}

貼り付けは間違いなくここでは間違っています。

編集-部分一致

部分一致を許可する場合は、exactfor[[FALSEまたはに設定できますNA。から?`[[`

値NAは部分一致を許可しますが、発生すると警告を発行します。値FALSEを使用すると、警告なしで部分一致が可能になります。

そしてまた

x $ nameは、x [["name"、exact=FALSE]]と同等です。


あなたのコメントに照らして。Rのマニュアル2.1.8Hadleyのdevtoolswikiを見て、関数の引数と約束を確認する必要があると思います。

Promiseオブジェクトは、Rの遅延評価メカニズムの一部です。これらには、値、式、および環境の3つのスロットが含まれています。関数が呼び出されると、引数が一致し、正式な引数のそれぞれがPromiseにバインドされます。その正式な引数に指定された式と、関数が呼び出された環境へのポインターは、promiseに格納されます。

その引数にアクセスするまで、promiseに関連付けられた値はありません。引数にアクセスすると、格納された式が格納された環境で評価され、結果が返されます。結果もpromiseによって保存されます。置換関数は、式スロットの内容を抽出します。これにより、プログラマーは、promiseに関連付けられた値または式のいずれかにアクセスできます。

だからあなたが合格すると

gtData(data = mtcars, field = mpg)

引数はpromiseであり、関数内でアクセスされたときに呼び出し元の環境からdataのオブジェクトである値を持ちます。mtcars

マニュアルで提案されているように、呼び出し環境で関連付けられている値ではなくfield文字列にアクセスする場合は、これを行うための慣用的な方法は次のようになります。"mpg"mpgdeparse(substitute())

例えば

gtData <- function(data,field,k){
  fieldChar <- deparse(substitute(field))
  a <- data[[fieldChar]]
}

これを行う危険性はfield、関数内でアクセスできると考えた場合に発生します。その場合、関数は評価され、エラー(呼び出し元の環境に存在しない場合)またはおそらく意図しない値が返されます。定義されいる場合

于 2013-02-07T22:09:25.627 に答える
0

mnelのおかげで、「[」の代わりに$を使用することが問題であることに気付きました。彼はまた、優れた参考資料を提供しました。

しかし、解決策は単純でした。関数内のフィールドをその名前で呼び出す代わりに、その番号で呼び出す必要があります。したがって、data [、x]は問題なく機能します。

ありがとうmnel

于 2013-02-08T19:23:05.883 に答える