1

Mathematica では、式をリストにマッピングしながら、より複雑な式で変換を使用しようとしています。なんらかの理由で、変換ルールを使用するとまったく異なる値になりますが、その理由はドキュメントからわかりません。

Clear[x, values]

values = {{1}, {2, Null, 3}, {4, 5, Null, 6, Null }}
Out[122]= {{1}, {2, Null, 3}, {4, 5, Null, 6, Null}}

Length[x] /. x -> DeleteCases[#, Null] & /@ values
Out[123]= {0, 0, 0}

Length[DeleteCases[#, Null]] & /@ values
Out[124]= {1, 2, 3}

更新: これまでのところ、 が定義されていないLength[x]場合でも有効な式であるxことがわかりました。これは、引数 toLength[]がその式のコンポーネントの数を返す式であるためです。xここで、置換されるまで評価を遅らせる方法を理解する必要があります。

4

3 に答える 3

1

Hold[]andを使った式の早期評価を防ぐことができましたReleaseHold[]

In[229]:= ReleaseHold[Hold[Length[x]] /. x -> {1, 2, 3}]
Out[229]= 3

Length[x] /. x -> {1, 2, 3}
Out[230]= 0

元の質問のコンテキストでは、これを解決する方法は次のとおりです。

ReleaseHold[Hold[Length[x]] /. x -> DeleteCases[#, Null]] & /@ values
于 2013-08-01T20:03:44.980 に答える
1

左辺が評価される前に置換を行うには、次を使用できますUnevaluated

Unevaluated[Length[x]] /. x -> DeleteCases[#, Null] & /@ values
{1, 2, 3}

この頭の詳細については、Robby Villegas によるWorking with Unevaluated Expressionsをお読みください。


専用の StackExchange サイト:
ここに画像の説明を入力

于 2013-08-05T21:40:45.243 に答える