R语言为什么总会给一些名字前加X
在R语言中进行数据导入,如果用到类似data.frame()这种从R语言1.90版本之前就有的函数,就会发现列名如果是数字会增加一个X。这个很烦,于是今天深入研究了一下这是为什么。夫人说我这是浪费时间,我跟她说,我这是在登陆火星。
- 导入数据名字前居然加了个X?
- R语言什么函数决定了这个X?
- 初探R内核函数
导入数据名字前居然加了个X?
数据导入,如果用data.frame()会发现列名如果是数字会增加一个X在前面,比如:
a<-data.frame(country=c("A","B","C"),"1999"=paste(c(0.7,37,212),"K"),"2000"=paste(c(2,80,213),"K"))
这样计算出来是这样的
country X1999 X2000
1 A 0.7 K 2 K
2 B 37 K 80 K
3 C 212 K 213 K

看着就觉得烦,所以我觉得搞清这个问题比较有意思。
R语言什么函数决定了这个X?
查了一下data.frame()的R代码,发现:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
fix.empty.names = TRUE, stringsAsFactors = default.stringsAsFactors())
首先,默认有一个叫做,check.names的东西,默认为TRUE
接下来,它的函数中有这么一段
if (check.names) {
if (fix.empty.names) #在这里判断是否为空
vnames <- make.names(vnames, unique = TRUE)
else {
nz <- nzchar(vnames) #看vname是否都为字符串
vnames[nz] <- make.names(vnames[nz], unique = TRUE) #重点在这里
}
}
那么make.names何许人也? 这是一个把字符串改编成所谓语法上有效的字符,让我们看看什么叫有效:
function (names, unique = FALSE, allow_ = TRUE)
{
names <- as.character(names)
names2 <- .Internal(make.names(names, allow_))
if (unique) {
o <- order(names != names2)
names2[o] <- make.unique(names2[o])
}
names2
}
看到这个我就惊了,内置代码.....也就是R语言的内核!!!
初探R内核函数
既然涉及到内核,那么久看看R的内核吧,在R官网 r语言内核CRAN官网 内核其实是c语言编译的,查找之后这个内核的make.names在一个叫name.c的文件中
{"make.names", do_makenames, 0, 11, 2, {PP_FUNCALL, PREC_FN, 0}}
最后在character.c的文件中找到了这个do_makenames函数 这个作为一个内核函数,定义了怎么把传入的值变得合理,比如数字开头的加X,无效字符变成.,缺失字符显示NA等一系列判断。 看这一句
/* need to prefix names not beginning with alpha or ., as
well as . followed by a number */
need_prefix = FALSE;
if (!isalpha(0xff & (int) This[0])) need_prefix = TRUE;
可以自行百度二进制补码的只是,这句意思大概就是第一位如果是不是字母就需要修饰
怎么修饰呢?
if (need_prefix) {
tmp = Calloc(l+2, char);
strcpy(tmp, "X");
strcat(tmp, translateChar(STRING_ELT(arg, i)));
}
什么内存占位什么的,自行百度上面几个函数,大概意思就是,在前面加个X
可以尝试,如果你把题目名字变成了“..1”出来就不会加X,而如果变成".1"前面就会有X、
如何去掉X
所以,重点来了!!!
**R1.90版本之前,很奇怪,很多命名都不允许,而在目前R的版本,下划线,数字开头这些命名都是允许的。
data.frame这个函数自R初始就有,所以就保留了这些习惯,如果不想要X,直接把check.names = F就行了**
后记
刚才跟我夫人说,我在登陆火星,我夫人也一头雾水,她就是觉得我大半夜不睡觉还登陆火星=-=。
其实是这样。有一个问题,人类为什么要探索宇宙?曾经NASA提出探索宇宙等计划时,很多人站出来反对,因为登月看起来没啥用,还要花费相当巨额的财富,也牺牲了一大批宇航员,这些钱如果用在救济贫困,这些优秀的人去当民航飞行员,岂不美哉?所以,为什么人类要探索宇宙。
我的看法,探索未知是人类的本性,而在探索中你会收获到意想不到的财富。(有木有觉得像海贼王,哈哈)。
大家可以随意百度,在探索宇宙过程中,诞生了哪些科技?不光是航天科技,甚至我们生活中用到,比如条形码就是航天科技的产物。
我为什么说本性呢?如果相信人类是从猩猩的祖先进化来的,那么在那时,一大堆猩猩在大草原上晒太阳,动物们都满足于眼前的吃喝,吃饱喝足就开始休息。没动物想去做多点什么。而就是那么几只进化了一点的猩猩,决定探索草原,于是踏过山和大海,走过平原草地,在这个过程中出现了交流的语言,出现了烹饪,出现了工具。这才成为了我们人类。
我在做这个看起来没意义的问题的过程中,你估计也看到了我发现了什么宝藏吧~
