問題タブ [least-astonishment]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
88 参照

r - data.frame の列数を 1 に減らすことができる場合に factor への変換を防止する

列の条件のリストに基づいてデータ フレームから項目を抽出できる手順があります ( (column_name = value) リストとして指定された基準を使用して R データ フレームから項目を抽出するを参照)。

データフレームと条件リストは次のとおりです。

lib私の目標は、リストで指定された基準に対応する行の列の値を抽出することです。

次の関数を使用して、必要な値を抽出できます。

これは、上記のデータ フレームでうまく機能します。

ただし、これをより一般的にしたいと思います: Myexperimental_plancondition異なる列を持つことができます:

今回は失敗します:

この場合、予想される出力は次のようになります。

より堅牢な方法で同じことを実行する関数を作成するにはどうすればよいですか?


コメント

両方のケースが非常に似ているにもかかわらず、関数が機能しないことは非常にイライラします。両方のデータフレームにlib列があり、両方のケースで条件リストの名前がデータフレームの列名に対応しています。

R は、データ フレームから抽出された列の数が 1 に減ると、明らかに自動的に data.frame を factor に変換します。

これは最小の驚きの原則に反します。同じタイプの入力が与えられた場合、計算は同じタイプの出力を返すと思います。

0 投票する
1 に答える
112 参照

c# - デフォルト値を持つオブジェクト初期化子内のコレクション初期化子

次の問題に出くわしました:

これが起こる理由を理解しています: AllowedIds = { 1, 2 }は割り当てではなく、オブジェクト初期化子内のコレクション初期化子です。つまり、 の暗黙的な呼び出しですAllowedIds.Add(1); AllowedIds.Add(2)

それでも、割り当てのように見えるので、私にとっては落とし穴でした( を使用しているため=)。

API/ライブラリ開発者 (私がクラスを開発しているとしましょう)として、最小の驚きの原則Settings守りたいと思っていますが、ライブラリの消費者がその罠に陥るのを防ぐためにできることはありますか?


脚注:

  • その特定のケースでは、 のISet/HashSet<int>代わりに を使用できますICollection/List(重複は には意味がないためAllowedIds) 1, 2。それでも、初期化AllowedIds = { 2 }すると直観に反する結果が得られ1, 2ます。

  • C# github repoで関連する議論を見つけました。基本的に、この構文は紛らわしいですが、これは古い機能 (2006 年に導入された) であり、後方互換性を壊すことなく変更することはできません。