[問題] <<- 全域變數賦值

作者: skylikewater (choc.)   2014-09-25 16:45:42
[問題類型]:
程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
[軟體熟悉度]:
使用者(已經有用R 做過不少作品)
[問題敘述]:
簡單說我的問題是在子函式中對變數宣告跟賦值時使用 <<- 符號,
產生不穩定的結果。想知道是否誤解 <<- 的用法、或是有更好的處理方法。
我的程式是受試者資料 coding,
每個人在自己的 csv 表格檔案裡裡大概有數百個變數如下:
姓名 性別 年齡 教育
王大明 男 18 12
身高體重
身高 體重 BMI 體脂 腰圍
180 70 NA 12 30
...
我把檔案
read.csv
Name = array(0,dim = c(TotalNum,1))
Name[SubjNum] = as.character(Data$V1[2])
然後再做些常模之類的查照計算。
最近檔案實在太大,
我試著模組化每個分量表到不同的 .r 裡,就出現了賦值上的問題
如前輩們所知,一個函式只能 return 一個值,
我看不太懂 assign 的功能、感覺不和我的需求,
最近嘗試做了 setClass 但語法會變得太龐雜。
於是我試著全局賦值 <<-
變成在 Data.r 中
source('LoadBody.r')
# Declaration
LoadBody(1, 1)
# Input
for (SubjNum in 1:TotalNum) {
read.csv
LoadBody(2, SubjNum)
}
# Data frame
eval(parse(text = paste("AllData = data.frame(",
LoadBody(3, NowCodingNum),
(...)
")", sep = "")))
然後有個子函式 LoadBody.r 如下
LoadBody <- function(Task, SubjNum) {
if (Task == 1) {
Name <<- array(0,dim = c(TotalNum,1))
...
} else if (Task == 2) {
Name[SubjNum] <<- as.character(Data$V1[2])
...
} else if (Task == 3) {
return("Name = Name, (...) ")
}
}
但到最後出來的表格卻有很多異常,
例如明明有資料的位置卻是錯誤的行列(這已經再三確認過了)或是空白,
那些錯誤的點,在執行個別的子函式(e.g. LoadBody.r)時並不會發生。
試著查資料很難查到關鍵字,
只有在這篇 COS 论坛 的討論中有實例:
http://cos.name/cn/topic/106368
提到 <<- 是逐層向外搜索的,建議大家盡量避免。
在我的情況下則是有時正確,有時不正確。
我想請前輩建議適合的替代方案,或是我對 <<- 的賦值有什麼根本性的誤解呢?
感謝!
[程式範例]:
大致如上,具體的資料畢竟是受試隱私,也有點大
[關鍵字]:
函數 全域賦值 <<-
作者: obarisk (OSWALT)   2014-09-25 18:02:00
函數可return一個變數,變數可以是值可以是list也可以是env<<-除非必要,還是少用
作者: andrew43 (討厭有好心推文後刪文者)   2014-09-25 21:44:00
回傳 list 就好了。大多數的內建function都是這麼做的
作者: gsuper (Logit(odds))   2014-10-03 13:21:00
函式包函式是問題的主因 單純函式用 <<- 還是方便的多同樣的問題也會發生在跑平行運算的時後

Links booklink

Contact Us: admin [ a t ] ucptt.com