4

私はJavascriptを学んでいますが、以下の使用法を少し混乱させました。これらの質問は、d3 固有というよりも JavaScript に関連している可能性があります。

http://mbostock.github.com/d3/ex/sunburst.html

var arc = d3.svg.arc()
.startAngle(function(d) { return d.x; })
.endAngle(function(d) { return d.x + d.dx; })
.innerRadius(function(d) { return Math.sqrt(d.y); })
.outerRadius(function(d) { return Math.sqrt(d.y + d.dy); });

それで、

  1. startAngle、endAngle などは関数を引数として取ります。引数が単なる数値ではなく関数であるという根拠は何ですか?
  2. 完全なコードでは、「d」が定義されている場所はありません。ほとんどすべての d3 プログラムで見られます。「d」とは何ですか?どのように設定され、どこに渡されますか?

ありがとう。

4

4 に答える 4

5

あなたの最初の質問に:

このd3.svg.arcオブジェクトは、円グラフ内にスライスを作成するために使用されます。これらの各スライスを適切に表示するには、異なる開始角度と終了角度が必要です。

ではd3.js、各スライスに両方の角度を渡すのではなく、dそのスライスに対応するデータ要素である 1 つの引数を取り、角度を返す関数を提供します。ここで設定する他のパラメータも同様です。

もう 1 つの利点は、データムが複数のプロパティで構成され、ビジュアライゼーションに関してどのプロパティがどの部分を占めるかを決定できることです。

2 番目の質問

関数を別の関数のパラメーターとして使用する場合、指定された形式の関数式を使用するのが一般的です。パラメータとして機能するほとんどの関数ではd3.js、1 つまたは 2 つのパラメータ自体が渡されます (ほとんどの場合、変換が必要なデータの一部)。関数式では、これらのパラメーターに対処するために、これらのパラメーターに名前を付ける必要があります (または少なくとも名前を付ける必要があります)。この例では、ほとんどの場合d、特定のデータ項目を保持するパラメーターのパラメーター名として使用されています。

通常の関数パラメーターであるため、他の場所で定義する必要はありません。必要に応じて、次のように書き換えることができます。

function startAngleParam( d ) {
 return d.x;
}

var arc = d3.svg.arc()
.startAngle( startAngleParam )
...
于 2012-06-04T13:15:11.587 に答える
1

1: コールバック関数です。関数は、パラメーターとして送信しても呼び出されません。代わりに、関数は保持され、後で呼び出すことができ、必要なときに何度でも呼び出すことができます。

2: パラメータdは、関数が結果を生成するために使用する、コールバック関数に送信される単なる値です。識別子名dはコールバック関数でのみ定義され、関数が使用されるときはいつでも、値は通常どおり関数に送信されます。

コールバック関数に送信される値は、円弧の座標を含むオブジェクトです。円弧の座標が変更されると、コールバック関数が呼び出されて、円弧の描画に必要なその他の値が計算されます。

于 2012-06-04T13:11:47.540 に答える
1

まだコメントできませんが、Sirko の優れた回答に追加したいと思います。彼は次のように述べています。

d3.js では、各スライスに両方の角度を渡すのではなく、dそのスライスに対応するデータ要素である 1 つの引数を取り、角度を返す関数を提供します。

フォームのコールバックも発生する可能性があることを付け加えておきますfunction(d, i) { ... }。これが表示されたらd、要素のデータをi参照し、そのインデックスを参照します。慣例により、1 文字の省略形が使用されますが、パラメーターは好きなように呼び出すことができます。

これらの項目の両方にアクセスできると、データを繰り返し処理するときに役立ちます。たとえば、このチュートリアルでは、データとインデックスの両方を使用して棒グラフを作成します: http://mbostock.github.com/d3/tutorial/bar-1.html

于 2012-06-22T15:10:23.930 に答える
1

d無名関数への引数として非常に明確に渡されます。おそらく、これらの関数String.replace()引数として数値を受け取るか、より複雑な操作のための関数を受け取ることができます (置換文字列を取得する方法、または結果配列を実行して置換値を返す関数を取得する方法のようなものです)

于 2012-06-04T13:07:38.440 に答える