2009-06-01 109 views
28

我在R中工作,我想定義一些我(或我的合作者之一)無法更改的變量。在C++中,我會這樣做:在R中聲明常量變量

const std::string path("/projects/current"); 

如何在R編程語言中執行此操作?

編輯爲清楚:我知道,我在R中可以這樣定義字符串:

path = "/projects/current" 

我真正想要的是一個語言結構,保證沒有人能夠改變一個名爲「變量關聯的值路徑。」

編輯迴應評論:

這在技術上是真的,常量是編譯時保證,但它會在我的腦海有效的R解釋會拋出停止執行並顯示錯誤消息。例如,看一下當您嘗試將值分配給一個數值常量會發生什麼:

> 7 = 3 
Error in 7 = 3 : invalid (do_set) left-hand side to assignment 

所以我真正想要的是一個語言功能,使您可以賦值一次,只有一次,應該有某種當您嘗試將新值分配給聲明爲const的變量時出現錯誤。我不在乎錯誤是否在運行時發生,特別是如果沒有編譯階段。這在技術上可能不是維基百科定義中的常量,但它非常接近。它看起來在R編程語言中是不可能的。

回答

34

lockBinding

a <- 1 
lockBinding("a", globalenv()) 
a <- 2 
Error: cannot change value of locked binding for 'a' 
-1

我把下面從this website

R的表達的最簡單的排序僅僅是一個恆定值,通常爲數字值(數字)或文字值(一段文字)的回答。例如,如果我們需要指定與10分鐘相對應的秒數,則我們指定一個數字。

> 600 
[1] 600 

如果我們需要指定想要從中讀取數據的文件的名稱,我們將該名稱指定爲字符值。字符值必須用雙引號或單引號括起來。

> "http://www.census.gov/ipc/www/popclockworld.html" 
[1] "http://www.census.gov/ipc/www/popclockworld.html" 
+1

你有無法改變一次分配變量混亂的常量。 – 2009-06-01 21:09:21

+0

@大衛洛克 - 好點。我試圖在問題中澄清這一點。 – 2009-06-01 22:43:09

3

(編輯新的想法:)的bindenv功能環境中調整的環境和綁定提供

實驗接口。它們允許鎖定環境以及單個綁定,並將變量鏈接到函數。

這似乎是諸如此類的事情,可能造成安全的假象(如const指針非const變量),但它可能的幫助。

(編輯重點:) constcompile-time guarantee,而不是鎖定在內存中的位。由於R沒有編譯階段,它一次查看所有代碼(它是爲交互使用而構建的),因此無法檢查未來的指令是否會違反任何保證。如果有一個正確的方法來做到這一點,R-help名單上的人會知道。我建議的解決方法:假裝自己的彙編。編寫一個腳本來預處理您的R代碼,手動將相應的文字替換爲「常量」變量的每個外觀。

(原文:)你希望從一個變量的C「const」中獲得什麼好處?由於R只有call-by-value semantics(除非你在環境中進行一些調整),所以沒有任何理由擔心通過調用變量來打斷變量。採用某種命名約定或者使用某種OOP結構可能是正確的解決方案,如果您擔心您和您的協作者意外地使用具有相同名稱的變量。

您正在尋找的功能可能存在,但我懷疑它是否將R的起源看作是您希望能夠撤銷您的操作的交互式環境。

+0

我並不擔心通過調用函數來破壞變量,我只想保證在環境中提供的某些變量永遠不會改變。我基本上定義了一套分析工具,並且我定義了幾個常量,這些常量在程序執行過程中不應該改變。看起來這可能在R. – 2009-06-02 04:24:06

5

我敢肯定,這在R中是不可能的。如果你擔心不小心重寫值,那麼最簡單的做法是將所有常量放入列表結構中,然後你知道您何時使用這些值。喜歡的東西:

my.consts<-list(pi=3.14159,e=2.718,c=3e8) 

然後,當你需要訪問他們,你有一個非文件就知道什麼不該做,也它推動他們走出你的正常的命名空間。

另一個要問的地方是R開發郵件列表。希望這可以幫助。

1

R沒有語言常量功能。上面的列表想法很好,我個人使用像ALL_CAPS這樣的命名約定。

6

由於您打算將代碼分發給其他人,您可以(應該)考慮創建一個包。在該軟件包內創建一個NAMESPACE。在那裏你可以定義具有固定值的變量。至少是你的軟件包使用的功能。看看Tierney (2003) Name Space Management for R