[问题] <<- 全域变量赋值

楼主: 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