edit global variable in my package
場景
最近自己做了個R語言的package,主要是封裝一些功能函數。後面陸續增加了些功能,有點框架調用的樣子。這就涉及到包內的全局變量問題。假設我的包名爲mypackage
,我想實現一個獲取遞增序號的功能。
代碼1
COUNT <- 1
get_sn <- function(){
COUNT <- COUNT + 1
return(COUNT)
}
多次調用mypackage::get_sn()
,結果均爲2,這應該是COUNT沒有被理解爲全局變量的緣故。
代碼2
COUNT <- 1
get_sn <- function(){
COUNT <<- COUNT + 1
return(COUNT)
}
調用mypackage::get_sn()
報錯。錯誤爲Error in COUNT <<- COUNT + 1 : 無法改變被鎖定的聯編'COUNT'的值
。
我理解爲COUNT被定義成了const
,是read only
的。
而嘗試通過直接修改,mypackage::COUNT <- 100
也是不行的,錯誤是Error in mypackage::COUNT <- 1 : 找不到對象'mypackage'
。這裏我只能理解爲可讀不可寫,與其他語言的namespace
使用上還是有些差距。
解決方案
可以通過environment來明確要修改的變量。
代碼3
myenv <- new.env()
myenv$COUNT <- 1
get_sn <- function(){
myenv$COUNT <- myenv$COUNT + 1
return(myenv$COUNT)
}
多次調用mypackage::get_sn()
就可獲得遞增的數字了。
這裏特別要注意的是,mypackage::myenv$COUNT <- 100
直接修改也是會報錯,找不到對象。