亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在R中使用“<-”(范圍分配)?

如何在R中使用“<-”(范圍分配)?

有只小跳蛙 2019-07-27 15:15:04
如何在R中使用“<-”(范圍分配)?我剛讀完R簡介中的范圍界定,我很好奇<<-任務。手冊給出了一個(非常有趣)的例子<<-我覺得我能理解。我仍然缺少的是什么情況下這可能是有用的。因此,我想從您這里讀到的是示例(或指向示例的鏈接)。<<-可能是有趣的/有用的。使用它的危險是什么(看起來很容易失控),以及任何您可能想分享的提示。
查看完整描述

3 回答

?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

<<-與閉包一起維護狀態最有用。以下是我最近的一篇論文中的一節:

閉包是由另一個函數編寫的函數。閉包之所以被稱為閉包,是因為它們圍封父函數的環境,并可以訪問該函數中的所有變量和參數。這很有用,因為它允許我們有兩個級別的參數。一個級別的參數(父級)控制函數的工作方式。另一層(孩子)做這項工作。下面的示例演示如何使用此思想生成一系列冪函數。父函數(power)創建子函數(squarecube)這實際上是一項艱苦的工作。

power <- function(exponent) {
  function(x) x ^ exponent}square <- power(2)square(2) # -> [1] 4square(4) # -> [1] 16cube <- power(3)cube(2) # -> [1] 8cube(4) # -> [1] 64

在兩個級別管理變量的能力還使得通過允許函數修改父函數環境中的變量來維護跨函數調用的狀態成為可能。在不同級別管理變量的關鍵是雙箭頭賦值操作符。<<-..與通常的單一箭頭分配不同(<-)如果始終在當前級別上工作,則雙箭頭運算符可以修改父級別中的變量。

這樣就可以維護一個計數器來記錄函數被調用的次數,如下例所示。每次new_counter,則創建一個環境,初始化計數器。i在這個環境中,然后創建一個新函數。

new_counter <- function() {
  i <- 0
  function() {
    # do something useful, then ...
    i <<- i + 1
    i  }}

新函數是封閉的,它的環境是封閉的環境。當關閉時counter_onecounter_two運行時,每個計數器都會在其包圍的環境中修改計數器,然后返回當前計數。

counter_one <- new_counter()counter_two <- new_counter()counter_one() # -> [1] 1counter_one() # -> [1] 2counter_two() # -> [1] 1



查看完整回答
反對 回復 2019-07-28
?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

它有助于思考<<-相當于assign(如果設置inherits函數中的TRUE)。.的利益assign它允許您指定更多的參數(例如環境),所以我更喜歡使用assign過關<<-在大多數情況下。

使用<<-assign(x, value, inherits=TRUE)意味著“搜索所提供環境的封閉環境,直到遇到變量‘x’。”換句話說,它將繼續按順序遍歷環境,直到找到一個具有該名稱的變量,并將其賦值給該變量。這可以在函數的范圍內,也可以在全局環境中。

為了了解這些函數的作用,您還需要了解R環境(例如,使用search).

在運行大型模擬時,我經常使用這些函數,并且希望保存中間結果。這允許您在給定函數的作用域之外創建對象,或者apply循環。這是非常有幫助的,特別是如果您對大循環意外結束(例如數據庫斷開)有任何擔心,在這種情況下,您可能會丟失整個過程中的所有內容。這相當于在長時間運行的過程中將結果寫入數據庫或文件,而不是將結果存儲在R環境中。

我對此的主要警告是:要小心,因為您現在正在處理全局變量,特別是在使用<<-..這意味著,當您期望函數使用作為參數提供的對象值時,您可能會遇到這樣的情況:函數正在使用來自環境的對象值。這是函數式編程試圖避免的主要問題之一(請參閱副作用)。我通過將值賦值給函數中從未使用過的唯一變量名(使用帶有集合或唯一參數的粘貼)來避免這個問題,但只用于緩存,以防以后需要恢復(或對中間結果進行一些元分析)。




查看完整回答
反對 回復 2019-07-28
  • 3 回答
  • 0 關注
  • 680 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號