2011-08-18 47 views
2

我的問題是關於兩種方式來傳遞一個函數的參數之間的差別不是調用參數的影響是什麼,而調用函數

例如

function1(obj1, obj2, obj3, obj4, obj5) 

function1(arg1=obj1, arg2=obj2, arg3=obj3, arg4=obj4, arg5=obj5) 

是否有規則/公約/文件?

我可以看到至少2分的情況下,第一種方式是不是很大

  1. 如果我們要添加一個新的參數,我們被迫將其在列表的末尾添加,這可能不是很大對於常識(因爲我喜歡將參數集中在一起)
  2. 帶有默認參數的參數必須放在列表的末尾,否則即使使用默認值也必須輸入它。

對此有何意見?

+0

在這個問題不可避免地以投票方式結束之前,我會指出,恕我直言,認爲唯一可能的風格是(a)永遠不會命名參數或(b)始終命名參數。你可以做到這一點。 – joran

+0

我的問題是關於利弊,或者我們何時可以安全地不使用名稱參數 – RockScience

+0

爲什麼這個問題不符合條件? – RockScience

回答

3

對我來說,問題很簡單:可重複的結果需要可重現和明確的函數調用。

在我的情況下,我使用命名參數瞭解到另一個人可能會在他們的函數中插入一個新參數,如果他們這樣選擇,導致我的代碼中斷。

我還傾向於將參數存儲在列表中,並在調用函數時使用這些參數,例如, someCrazyFunction(stuff = stuff, eps = Par$eps, tol = Par$tol, verbose = Par$verbose, strict = Par$strict, debug = Par$debug)

如果我不這樣做,我不盡我自己的本分來確保可重現的結果。這只是一些擊鍵,我不必擔心函數或包的作者是否會移動參數,插入新參數,刪除一些參數(我會注意到,因爲R會告訴我不需要某個對象),或以其他方式做出看似無害的更改。如果他們做出這樣的改變,那麼看看我的代碼的其他人怎麼能確定如何重現與我創建時相同的調用?

課程:調試比確保可重複性所需的少量擊鍵要痛苦得多。


(次要更新)This question & the selected answer from elsewhere on SO例示了包創建者,並用在程序包的相關的人之間的這種隱性契約的特定方面。如果我對給定的函數開發依賴項,並且作者只是簡單地將參數洗牌,那麼我的代碼應該完美地工作。他們沒有明確的約定,不要動,而且我可以假設沒有隱含的契約,它會以這種方式行事。我只假定他們不會改變參數的定義。

0

在像R這樣的函數式編程中,函數可以有三十個或某些參數。在這種情況下,參數名稱可以方便地使用默認參數值。

除此之外,特別是對於參數的簡短列表,參數名稱並不合適。

1

R中的函數參數可以通過位置或名稱進行匹配,而對於如何決定使用或濫用該函數的人來說,將東西壓入鍵盤的人員可以提供一定的靈活性。使用命名參數的直接好處之一是,您可以根據需要更改函數中參數的順序。即

function1(arg1=obj1, arg2=obj2, arg3=obj3, arg4=obj4, arg5=obj5) 

function1(arg5=obj5, arg4=obj4, arg3=obj3, arg2=obj2, arg1=obj1) 

將以相同的方式評估,而

function1(obj1, aobj2, obj3, obj4, obj5) 

function1(obj5, aobj4, obj3, obj2, obj1) 

不會。函數的參數也可以被部分匹配並使用以下標準進行匹配:

  1. 完全匹配對於命名參數
  2. 部分匹配用於命名參數
  3. 位置匹配

這可以明顯地導致如果您不小心使用部分匹配,則會產生一些意想不到的後果。我相信如果一個參數與名稱相匹配,它就會從位置搜索中「移除」,儘管目前我還找不到具體的參考。作爲常用的註釋,我傾向於看到人們在函數中使用位置匹配作爲第一個參數,然後通過名稱指定其他可能是可選的後綴。再次,就我而言,這大多是個人習俗和習慣。

+0

實際上,如果你定義參數列表像(x,y,z)那麼用(z = 3,y = 10,x = 30)調用將得到正確的賦值給那些參數並且不會導致位置匹配。你給出了我要給的答案,但是當我測試它時。我的不好理解「變成了灰塵」。 –

2

從功能實現者的角度來看,你必須總是在結尾添加新的參數並命名它們,以便它們沒有與現有參數相同的前綴。

這是因爲人們可以自由使用位置匹配和部分名稱。 R life的事實...

相關問題