임의의 인수를 받아들이고 단일 인수를 처리하는 것과 동일한 방식으로 처리하는 함수 (R로 작성)의 API를 재현하려고합니다. 다른 데이터 세트의 목록입니다.
함수를 다음과 같이 정의 할 수있는 Mathematica 관용구가 있습니까?
f[ arg1, arg2, ..., argN ]
동작
f[ {arg1, arg2, ..., argN} ]
?
댓글
답변
Andy Ross가 주석에서 설명한대로 인수를 표준 형식으로 전처리하는 정의를 만들 수 있습니다. 단순히 유연성을 설명하기 위해 그의 예를 돌리십시오.
f[{args__}] := f[args] f[args__] := Multinomial[args] / Plus[args] f[{12, 7, 3}] == f[12, 7, 3]
True
이 방법은 더 복잡한 전처리에 유용하지만 이와 같은 간단한 경우에는 종종 Alternatives
를 사용하는 것이 더 쉽습니다.
g[{args__} | args__] := Multinomial[args]/Plus[args] g[{12, 7, 3}] == g[12, 7, 3]
참
Alternatives
를 사용하여 패턴은 순서대로 시도되므로 수동으로 주문해야합니다. 패턴 args__ | {args__}
는 args__
가 단일 인수로 {12, 7, 3}
와 일치하므로 원하는대로 작동하지 않습니다. .
답변
이를 처리하는 방법에는 여러 가지가 있습니다. 내가 취할 수있는 접근 방식은 다음 예에서 설명 할 수 있습니다.
f[seqn : ___] := Module[{args = {seqn}}, Switch[args, {{___}}, "List of args", {_}, "One arg", {_, __}, "Two or more args", {}, "No args" ]] f[{x, y, z}] (* ==> "List of args" *) f[{x}] (* ==> "List of args" *) f[] (* ==> "No args" *) f[x] (* ==> "One arg" *) f[x, y, z] (* ==> "Two or more args" *)
물론이 기술의 각 응용 프로그램은 여기에 표시된 문자열을 일부 문자열로 대체합니다. 자신의 필요에 적합한 조치입니다.
또 다른 접근 방식은 처리하려는 각 인수 패턴에 대해 별도의 함수를 작성하는 것입니다.
g[args : {___}] := "List of args" g[] := "No args" g[arg_] := "One arg" g[arg_, rest__] := "Two or more args" g[{x, y, z}] (* ==> "List of args" *) g[{x}] (* ==> "List of args" *) g[] (* ==> "No args" *) g[x] (* ==> "One arg" *) g[x, y, z] (* ==> "Two or more args" *)
코멘트
- " 가장 가능성이 높은 "에 대한 이유는 무엇입니까? 여러 정의에 대해 = “fa207eb35f”>
? Switch
는 일반적으로 더 느리고 원인없이 사용해서는 안됩니다, IMHO.
Switch
를 사용하면 모든 대안을 단일 기능으로 처리 할 수 있도록 구성하기 때문에 프로그래밍 미학에 호소합니다. 저는 ' 일반적으로 실행 속도에 대해 그다지 걱정하지 않습니다. 느린 실행이 실제로 분명해질 때까지는 아닙니다.
f[args___]:= f[{args}]
다음f[{arg1_, arg2_,...}]
에 대한 정의를 제공합니다.