R语言代码里的英文句号“.”有什么含义么

Python046

R语言代码里的英文句号“.”有什么含义么,第1张

作者:任坤

链接:https://www.zhihu.com/question/24908785/answer/29404778

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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 一样的以对象为基础的管道操作。

p匹配的是它自己,这就是原义表达式。

本来只想匹配 . ,但是在这里这个点代表了所有字符,于是返回了1 2 3。这个. 就是一个转义表达式。

分别提取含7-9的数字或3-4的数字的字符串

^XX就是以XX开头的意思

当^放在方括号内是取非的意思

2{2,3}是寻找2倍重复了2到3次的意思

2{2,}是寻找2倍重复了大于2次(2到+无穷)的意思

fo+表示+紧跟着的o可以被重复1次或1次以上

大括号也可以起到这样的作用

若想让紧跟在o后面的对fo都起作用,需要小括号

与+用法一致。+表示重复了1次或1次以上,*表示0次或0次以上。

.* 可以匹配任意字符

管道符连接前后,符合其一即会被返回

\\b也可以起到一样的作用,但\\b更灵活,既可以放开头也可以放结尾。(\\b主要是匹配边界)

\的作用就是说明^不是开头的意思,是要去匹配这个符号

对所有的转义符号都适用

就是把左件的值发送给右件的表达式,并作为右件表达式函数的第一个参数,就是管道函数。

例如:

anscombe_tidy <- anscombe %>%mutate(observation = seq_len(n()))

以上代码等价于:

anscombe_tidy=mutate(anscombe,observation = seq_len(n()))

扩展资料:

1、管道函数的作用

%>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存。

符号%>%,这是管道操作,其意思是将%>%左边的对象传递给右边的函数,作为第一个选项的设置(或剩下唯一一个选项的设置)

2、管道函数的语法

在普通的函数中,使用dbms_output输出的信息,需要在服务器执行完整个函数后一次性的返回给客户端。如果需要在客户端实时的输出函数执行过程中的一些信息,在oracle9i以后可以使用管道函数(pipeline function)。

关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数的返回值类型必须为集合,在函数中,PIPE ROW语句被用来返回该集合的单个元素,函数以一个空的RETURN 语句结束,以表明它已经完成。

例如:

create or replace type MsgType as table of varchar2(4000)

/

create or replace function f_pipeline_test return MsgType

PIPELINED as

begin

for i in 1 .. 10 loop

pipe row('Iteration ' || i || ' at ' || systimestamp)

sys.dbms_lock.sleep(1)

end loop

pipe row('All done!')

return

end

/