R语言编程技术(1)

发布于:2021-10-14 09:58:11


R 语言作为我工作使用的第一门语言(有点初恋女友的感觉,羞涩), 所以颇有感情,也是它让我认识到了很多勤奋好学又独立的优秀的妹纸们(可惜她们都不是我的女票,泪崩),但是在现在 python 如日中天,连 kaggle 上的数据科学家们八成,甚至是九成都在使用 python 了,所以不能怪哥移情别恋,是现实太残酷。目前个人觉得是 Rstudio 公司撑起了 R 的商业应用,虽然微软爸爸也之前也收购过R,但是还是觉得 Rstudio 家产品都很 nice。

R 系列的开篇,废话多一点,我主要会从编程技术角度来分享一下 R 的特性,这些是使用 R 的童鞋们在*时可能不会注意到的,也是导致写出来的 R 代码充分的发挥出了它的弱点。

R 的特性:


均是函数 延时计算 循环填充


事实胜于雄辩,用代码说话最具有说服力

一. 均是函数


# 正常加法运算
1 + 1
# `+` 函数调用
`+`(1, 1)
# 正常的赋值操作
a <- 1
# `<-` 函数调用
`<-`(a, 1)


R 语言是一种高级语言,是用底层语言来写的,所以它的各种运算符本身就是底层语言构造的函数的封装,你不信?那再看看。


# 小括号
`(`
# .Primitive("(")
# 大括号
`{`
# .Primitive("{")
# 逻辑运算与
`&&`
# .Primitive("&&")

??.Primitive调用了底层的函数,这些符号居然都是函数,但是知道这些又有什么卵用呢?因为 R 属于比较高级的语言,所以函数的调用是有一定开销的,那么如果你的代码不够简洁,大量充斥着各种不必要的符号,这就无形增加了函数调用的开销,直接会导致代码运行慢的让你抓狂。。。


二.延时计算


f1 <- function(x, y) x + 1
f1(1)
# [1] 2
f2 <- function(x, y) x + y
f2(1)
# Error in f2(1) : 缺少参数"y",也没有缺省值

??同样是包含两个参数的函数,f1可以正常被调用,但是f2就会报错,为什么呢?这就是延时计算,参数只有被使用到的时候才会进行计算,f1 当中 y 并没有参与运算,所以就不会被使用,也不会被检查,在 C++ 这种编译型语言中无用参数会报出警告,而 f2 函数中y参与了运算,而在函数调用时没有传入该参数,所以会报错。
??同样知道这些有什么卵用?明白这样的机制就要注意创建函数时候避免构造无用参数,因为过多参数也会对代码造成开销,参数越少函数效率越高。
三.循环填充


data.frame(1:5, 1:10)
# X1.5 X1.10
# 1 1 1
# 2 2 2
# 3 3 3
# 4 4 4
# 5 5 5
# 6 1 6
# 7 2 7
# 8 3 8
# 9 4 9
# 10 5 10
data.frame(1:5, 1:11)
Error in data.frame(1:5, 1:11) : 参数值意味着不同的行数: 5, 11

??两行代码中同样是向量的维度不同,但是第一行代码可以打印出结果,但是第二行代码就报出行数不同的错误。为什么呢?因为循环填充,第一行代码中第二列向量是第一列向量的整数倍,所以第一列向量自动扩充自己和第二列向量等长。而第二行代码因为不是整数倍的关系,无法完成填充,但是单向量间的运算可以非整数倍填充。


1 + 1:10
# [1] 2 3 4 5 6 7 8 9 10 11
1:2 + 1:10
# [1] 2 4 4 6 6 8 8 10 10 12
1:2 + 1:3
# [1] 2 4 4
# Warning message:
# In 1:2 + 1:3 : 长的对象长度不是短的对象长度的整倍数

??第一行代码向量 1 将自己循环了 10 次变成了 c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 与向量 1:10 完成计算,第二行代码 向量 1:2 将自己循环了 5 次变成了 c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2) 与向量 1:10 完成计算, 第三行代码向量 1:2 将自己循环了 2 次 变成了 c(1, 2, 1) 与向量 1:3 完成了计算,虽然成功完成了计算,但是这里报出了一个警告。
??同样知道这些又有什么卵用呢?知道这样机制后,可以避免写显式的循环来增加不必要的函数调用开销,因为 R 本身会完成这样的填充。

相关推荐

最新更新

猜你喜欢