[問題] <<- 全域變數賦值
[問題類型]:
程式諮詢(我想用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
提到 <<- 是逐層向外搜索的,建議大家盡量避免。
在我的情況下則是有時正確,有時不正確。
我想請前輩建議適合的替代方案,或是我對 <<- 的賦值有什麼根本性的誤解呢?
感謝!
[程式範例]:
大致如上,具體的資料畢竟是受試隱私,也有點大
[關鍵字]:
函數 全域賦值 <<-
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.121.113
※ 文章網址: http://www.ptt.cc/bbs/R_Language/M.1411634747.A.6A9.html
※ 編輯: skylikewater (140.112.121.113), 09/25/2014 16:53:09
→
09/25 18:02, , 1F
09/25 18:02, 1F
→
09/25 18:02, , 2F
09/25 18:02, 2F
天啊!真是一句話點破!感謝 : )
※ 編輯: skylikewater (140.112.121.113), 09/25/2014 18:20:48
→
09/25 21:34, , 3F
09/25 21:34, 3F
→
09/25 21:44, , 4F
09/25 21:44, 4F
→
10/03 13:21, , 5F
10/03 13:21, 5F
→
10/03 13:21, , 6F
10/03 13:21, 6F
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章