r语言中句号(点号)“.”的含义是什么?

论坛 期权论坛 期权     
匿名用户1024   2021-5-15 00:10   6519   4
如题,初学R,对R整体的编程范式不是很理解,感觉很杂,有面向对象也有函数式也有其他的各种各样的东西。然后这个句号的问题一直困扰我。一般“.”都是用来引用对象中的属性之类的,但是R里面的“.“是做什么用的呢?比如read.csv()又比如is.na()。还是说他没有特殊含义?
分享到 :
0 人收藏

4 个回复

倒序浏览
2#
有关回应  16级独孤 | 2021-5-15 00:10:52 发帖IP地址来自
R中的 . 符号只是个普通字符,可以在符号名称中出现,下面几种情况中 . 具有特殊含义:
1. 一个 environment 中以 . 开头的变量默认被当作隐藏变量,用 ls.str() 不会被列出来,除非 ls.str(all.names = TRUE) .
2. 一些函数中 . 具有特殊的意义,比如线性模型函数 lm() 的 formula 参数中的 . 符号会被特殊解读,比如 lm(mpg ~ ., data = mtcars) 中 mpg ~ . 这个formula会被lm()解读成在mtcars数据表中以mpg为被解释变量,其他列为解释变量做线性回归模型,在变量很多的情况下可以简化代码,但风险是数据列变化时回归方程也跟着变,有些类似于SQL中使用 select * 的风险。
3. 不同的函数可能让 . 拥有不同的含义,比如dplyr::do()函数中的 . 就是指每个数据行,而magrittr::`%>%`右侧函数参数中出现的 . 是指符号左边的对象,pipeR::`%>>%`右侧表达式中的 . 是指符号左边的对象,rlist::list.map() 函数 expr 参数中的 . 被解读成 implicit lambda expression,表示需要映射的list中的每个元素本身。
4. (感谢 @王雨晨   的回答,差点遗忘了对于R来说最关键的一点).符号被专门用来实现R中一个比较简单的面向对象系统S3的method dispatch,即可以用UseMethod()定义一个方法xyz,那么xyz.class这指xyz方法对于class类型的实现。这种S3面向对象系统比较简单,也容易发生混淆,比如head.data.frame实际上是head对于data.frame类型的实现,但也可以定义head.data方法,然后定义一种frame类型,这样在代码中就会发生混淆。

总而言之,. 符号在一般的变量中只是一个普通符号而已,只不过有些函数用 . 提供特殊用法方便书写或引用,或者用作S3系统中分隔方法与类的字符。

=== 补充 1 ===
R中访问对象中的元素有多种情况,一类是取子集(subsetting),用 [] ,比如一个 list(a=1,b=2) ["a"] 获得 list(a=1),该运算对list, vector等对象有定义,对environment没有定义;还有一类是取元素(extracting),用 [[ ]] ,list(a=1, b=2) [["a"]] 获得元素值 1,这种情况也可以用 $ 来取元素,该计算对于environment有定义,但$对vector无定义。另外还有S4对象,需要用@ 符号来访问slot,背后对应的函数是slot()函数,不过这些也不是定死的,对于自己定义的对象总可以去自己实现 "[", "[[", "$" 等方法来定义如何计算,可以参见我的 renkun-ken/pipeR @ GitHub 扩展包中Pipe对象的 $.Pipe() (pipeR/pipe.R at master · renkun-ken/pipeR · GitHub),就可以动态生成 closure 实现仿佛 jQuery 或者 C# LINQ 一样的以对象为基础的管道操作。
3#
有关回应  16级独孤 | 2021-5-15 00:10:53 发帖IP地址来自
我认为最关键的作用应该是服务于S3的面向对象编程。

虽然R中没有完全遵照S3这个面向对象的系统,但是大部分统计功能是用S3实现的。默认在泛型函数后面用「.」加上类型名来表示针对某一类对象的函数。如泛型函数summary,其下有32种针对不同类型的「方法」,可以用
  1. methods(summary)
复制代码
来查看。如果你用lm拟合了一个线性模型,线性模型是一种特殊类型的统计对象,不同的函数在对拟合的模型做分析时需要用针对线性模型的方法来处理。于是还可以用
  1. methods(class = "lm")
复制代码
来查看当前的对象被哪些具体的函数来支持(35个)。

泛型函数的一个好处是使代码更可读。比如你拟合了一个线性模型后,需要对其做方差分析,可以用
[code]fit
4#
有关回应  16级独孤 | 2021-5-15 00:10:54 发帖IP地址来自
@任坤 说的很全面了。额外补充一点就是,如果说“一般“.”都是用来引用对象中的属性之类的”,似乎R中"$"更符合这一的描述,而“.“真的就是个普通字符而已~
5#
有关回应  16级独孤 | 2021-5-15 00:10:55 发帖IP地址来自
如果题主熟悉linux文件系统就不会陌生.
  • 可以作为普通的分隔字符,  如 x.filename.txt, "."分隔名称. 在R中对应is.na.
  • 最后的txt可作为文件类型符, 在R中对应print.data.frame, 后面的data.frame是类型. 前面的print是函数作用名称. print(df)和print.data.frame(df)作用一致.
  • linux下. 表示当前目录地址. 如: ls .; 对应在R里面可以把"."作为最简单的命名符号, 可以作为当前要处理变量, 可以作为默认函数等.


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:136515
帖子:27303
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP