当前位置: 首页 > 编程日记 > 正文

来自 Google 的 R 语言编码风格指南

来自 Google 的 R 语言编码风格指南

R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读、分享和检查. 以下规则系与 Google 的 R 用户群体协同设计而成.

  • 概要: R编码风格约定
  1. 文件命名: 以 .R (大写) 结尾
  2. 标识符命名: variable.nameFunctionNamekConstantName
  3. 单行长度: 不超过 80 个字符
  4. 缩进: 两个空格, 不使用制表符
  5. 空白
  6. 花括号: 前括号不折行写, 后括号独占一行
  7. 赋值符号: 使用 <-, 而非 =
  8. 分号: 不要用
  9. 总体布局和顺序
  10. 注释准则: 所有注释以 # 开始, 后接一个空格; 行内注释需要在 # 前加两个空格
  11. 函数的定义和调用
  12. 函数文档
  13. 示例函数
  14. TODO 书写风格: TODO(您的用户名)
  • 概要: R语言使用规则
  1. attach: 避免使用
  2. 函数: 错误 (error) 应当使用 stop() 抛出
  3. 对象和方法: 尽可能避免使用 S4 对象和方法; 永远不要混用 S3 和 S4

  • 表示和命名
  • 文件命名

文件名应以 .R (大写) 结尾, 文件名本身要有意义. 
正例: predict_ad_revenue.R (.R文件,小写,用连字符)
反例: foo.R

  • 标识符命名

在标识符中不要使用下划线 ( _ ) 或连字符 ( - ). 标识符应根据如下惯例命名. 变量名应使用点 (.) 分隔所有的小写字母或单词; 函数名首字母大写, 不用点分隔 (所含单词首字母大写); 常数命名规则同函数, 但需使用一个 k 开头.

    • variable.name 
      正例: avg.clicks 
      反例: avg_Clicks avgClicks
    • FunctionName 
      正例: CalculateAvgClicks 
      反例: calculate_avg_clicks calculateAvgClicks 
      函数命名应为动词或动词性短语. 
      例外: 当创建一个含类 (class) 属性的对象时, 函数名 (也是constructor) 和类名 (class) 应当匹配 (例如, lm).
    • kConstantName
  • 语法
  • 单行长度

最大单行长度为 80 个字符.

  • 缩进

使用两个空格来缩进代码. 永远不要使用制表符或混合使用二者. 
例外: 当括号内发生折行时, 所折行与括号内的第一个字符对齐.

  • 空白

在所有二元操作符 (=+-<-, 等等) 的两侧加上空格. 
例外: 在函数调用中传递参数时 = 两边的空格可加可不加.

不可在逗号前加空格, 逗号后总须加空格. 

正例:

tabPrior <- table(df[df$daysFromOpt < 0, "campaignid"])
total <- sum(x[, 1])
total <- sum(x[1, ])

反例:

tabPrior <- table(df[df$daysFromOpt<0, "campaignid"])  # 在 '<' 两侧需要增加空格
tabPrior <- table(df[df$daysFromOpt < 0,"campaignid"])  # 逗号后需要一个空格
tabPrior<- table(df[df$daysFromOpt < 0, "campaignid"])  # 在 <- 前需要一个空格
tabPrior<-table(df[df$daysFromOpt < 0, "campaignid"])  # 在 <- 两侧需要增加空格
total <- sum(x[,1])  # 逗号后需要一个空格
total <- sum(x[ ,1])  # 逗号后需要一个空格, 而非逗号之前

在前括号前加一个空格, 函数调用时除外.

正例: 
if (debug)

反例: 
if(debug)

多加空格 (即, 在行内使用多于一个空格) 也是可以的, 如果这样做能够改善等号或箭头 (<-) 的对齐效果.

plot(x    = xCoord,y    = dataMat[, makeColName(metric, ptiles[1], "roiOpt")],ylim = ylim,xlab = "dates",ylab = metric,main = (paste(metric, " for 3 samples ", sep="")))

不要向圆括号或方括号中的代码两侧加入空格. 
例外: 逗号后总须加空格.

正例:

if (debug)
x[1, ]

反例:

if ( debug )  # debug 的两边不要加空格
x[1,]  # 需要在逗号后加一个空格 

  • 花括号

前括号永远不应该独占一行; 后括号应当总是独占一行. 您可以在代码块只含单个语句时省略花括号; 但在处理这类单个语句时, 您必须 前后一致地 要么全部使用花括号, 或者全部不用花括号.

if (is.null(ylim)) {ylim <- c(0, 0.06)
}

或 (不可混用)

if (is.null(ylim))ylim <- c(0, 0.06)

总在新起的一行开始书写代码块的主体.

反例: 
if (is.null(ylim)) ylim <- c(0, 0.06) 
if (is.null(ylim)) {ylim <- c(0, 0.06)}

  • 赋值

使用 <- 进行赋值, 不用 = 赋值.

正例: 
x <- 5

反例: 
x = 5

  • 分号

不要以分号结束一行, 也不要利用分号在同一行放多于一个命令. (分号是毫无必要的, 并且为了与其他Google编码风格指南保持一致, 此处同样略去.)

  • 代码组织
  • 总体布局和顺序

如果所有人都以相同顺序安排代码内容, 我们就可以更加轻松快速地阅读并理解他人的脚本了.

  1. 版权声明注释
  2. 作者信息注释
  3. 文件描述注释, 包括程序的用途, 输入和输出
  4. source() 和 library() 语句
  5. 函数定义
  6. 要执行的语句, 如果有的话 (例如, printplot)

单元测试应在另一个名为 原始的文件名_unittest.R 的独立文件中进行.

  • 注释准则

注释您的代码. 整行注释应以 # 后接一个空格开始.

行内短注释应在代码后接两个空格, #, 再接一个空格.

# Create histogram of frequency of campaigns by pct budget spent.
hist(df$pctSpent,breaks = "scott",  # method for choosing number of bucketsmain   = "Histogram: fraction budget spent by campaignid",xlab   = "Fraction of budget spent",ylab   = "Frequency (count of campaignids)")
  • 函数的定义和调用

函数定义应首先列出无默认值的参数, 然后再列出有默认值的参数.

函数定义和函数调用中, 允许每行写多个参数; 折行只允许在赋值语句外进行. 
正例:

PredictCTR <- function(query, property, numDays,showPlot = TRUE)
  • 反例:
PredictCTR <- function(query, property, numDays, showPlot =TRUE)

理想情况下, 单元测试应该充当函数调用的样例 (对于包中的程序来说).

  • 函数文档

函数在定义行下方都应当紧接一个注释区. 这些注释应当由如下内容组成: 此函数的一句话描述; 此函数的参数列表, 用 Args: 表示, 对每个参数的描述 (包括数据类型); 以及对于返回值的描述, 以 Returns: 表示. 这些注释应当描述得足够充分, 这样调用者无须阅读函数中的任何代码即可使用此函数.

  • 示例函数
CalculateSampleCovariance <- function(x, y, verbose = TRUE) {# Computes the sample covariance between two vectors.## Args:#   x: One of two vectors whose sample covariance is to be calculated.#   y: The other vector. x and y must have the same length, greater than one,#      with no missing values.#   verbose: If TRUE, prints sample covariance; if not, not. Default is TRUE.## Returns:#   The sample covariance between x and y.n <- length(x)# Error handlingif (n <= 1 || n != length(y)) {stop("Arguments x and y have invalid lengths: ",length(x), " and ", length(y), ".")}if (TRUE %in% is.na(x) || TRUE %in% is.na(y)) {stop(" Arguments x and y must not have missing values.")}covariance <- var(x, y)if (verbose)cat("Covariance = ", round(covariance, 4), ".\n", sep = "")return(covariance)
}
  • TODO 书写风格

编码时通篇使用一种一致的风格来书写 TODO. 
TODO(您的用户名): 所要采取行动的明确描述

  • 语言
  • Attach

使用 attach 造成错误的可能数不胜数. 避免使用它.

  • 函数

错误 (error) 应当使用 stop() 抛出.

  • 对象和方法

S 语言中有两套面向对象系统, S3 和 S4, 在 R 中这两套均可使用. S3 方法的可交互性更强, 更加灵活, 反之, S4 方法更加正式和严格. (对这两套系统的说明, 参见 Thomas Lumley 的文章 "Programmer's Niche: A Simple Class, in S3 and S4", 发表于 R News 4/1, 2004, 33 - 36 页: http://cran.r-project.org/doc/Rnews/Rnews_2004-1.pdf.)

这里推荐使用 S3 对象和方法, 除非您有很强烈的理由去使用 S4 对象和方法. 使用 S4 对象的一个主要理由是在 C++ 代码中直接使用对象. 使用一个 S4 泛型/方法的主要理由是对双参数的分发.

避免混用 S3 和 S4: S4 方法会忽略 S3 中的继承, 反之亦然.

  • 例外
    1. 除非有不去这样做的好理由, 否则应当遵循以上描述的编码惯例. 例外包括遗留代码的维护和对第三方代码的修改.
  • 结语
    1. 遵守常识,

前后一致

    1. .

如果您在编辑现有代码, 花几分钟看看代码的上下文并弄清它的风格. 如果其他人在 if 语句周围使用了空格, 那您也应该这样做. 如果他们的注释是用星号组成的小盒子围起来的, 那您也要这样写。

遵循编码风格准则的意义在于, 人们相当于有了一个编程的通用词汇表, 于是人们可以专注于您在 说什么, 而不是您是 怎么说 的. 我们在这里提供全局的编码风格规则以便人们了解这些词汇, 但局部风格也很重要. 如果您加入文件中的代码看起来和周围的已有代码截然不同, 那么代码阅读者的阅读节奏就会被破坏. 尽量避免这样做. OK, 关于如何写代码已经写得够多了; 代码本身要有趣的多. 编码愉快!

  • 参考文献

http://www.maths.lth.se/help/R/RCC/

    1. - R语言编码惯例


http://ess.r-project.org/

    1. - 为 emacs 用户而生. 在您的 emacs 中运行 R 并且提供了一个 emacs mode.
posted on 2012-04-18 22:10 wentingtu 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/wentingtu/archive/2012/04/18/2456049.html

相关文章:

php中去空函数trim,PHP中trim()函数简单使用指南

string trim ( string $str [, string $charlist ] ) - 去除字符串首尾处的空白字符(或者其他字符)trim()函数当第二个参数为空时&#xff0c;默认去掉空格、制表符、换行符、回车符、垂直制表符等&#xff0c;当加入第二个参数时复制代码 代码如下:1) trim( \"string\&…

03 基本数据类型、运算符 输入输出

代码注释 单行注释&#xff1a;# 多行注释&#xff1a;可以用三对双引号""" """ 基本数据类型 事物的状态有不同的种类&#xff0c;使用不同类型的值去记录不同的状态 一、数字类型 1.整型int 定义&#xff1a;age10 #ageint(10)作用&#xff1…

wordpress调用树形目录

wordpress调用树形结构目录最简单的方法就是使用方法就是使用函数&#xff1a;<?php wp_list_categories( $args ); ?>另一种方法&#xff0c;方便自定义样式,代码如下&#xff1a;<div class"rightbox"><div class" cat_right_bg cat_title&…

php类方法语法错误捕获,php语法错误捕获

PHP语法错误捕获处理一般捕获错误使用的方法是&#xff1a;try{...}catch(Exception $e){echo $e->getMessage();}或者set_exception_handler(function ($exception) {echo $exception->getMessage();});示例&#xff1a;<?php function test(){throw new Exception(…

2019BATJ面试题详解:MyBatis+MySQL+Spring+Redis+多线程

这里为大家分享一些面试的一手资料&#xff0c;供大家迎接接下来的金三银四跳槽季SpringSpring 概述什么是spring?使用Spring框架的好处是什么&#xff1f;Spring由哪些模块组成&#xff1f;解释AOP模块Spring配置文件什么是Spring IOC 容器&#xff1f;依赖注入什么是Spring的…

高手讲解PHP遍历数组的方法

在PHP中数组分为两类&#xff1a; 数字索引数组和关联数组。其中数字索引数组和C语言中的数组一样&#xff0c;下标是为0&#xff0c;1&#xff0c;2…而关联数组下标可能是任意类型&#xff0c;与其它语言中的hash&#xff0c;map等结构相似。 下面介绍PHP中遍历关联数组的三…

QQ拼音在中文输入下默认英文标点

别小看这个功能, 感觉在写一些技术 Blog 的情况下还是挺有用的. 打开QQ拼音: 输入法设置->基本设置->初始状态->中文状态下使用英文标点. 转载于:https://www.cnblogs.com/qrlozte/p/4904087.html

matlab在输电线路故障测距中应用,Matlab在输电线路故障测距中的应用.doc

Matlab在输电线路故障测距中的应用毕业设计(论文)题目 Matlab在输电线路故障测距中的应用二级学院 电子信息与自动化学院专 业 电气工程及其自动化班 级 110070401学生姓名 施永平 学号 11007990223指导教师 雷绍兰 职称 教授时 间2014年2月24日至6月10日目录摘要IAbstractII1绪…

AES数据加密传输

问题&#xff1a;当数据调用没有使用https加密时&#xff0c;app被抓包&#xff0c;接口暴露&#xff0c;此时可能导致被刷等安全问题 解决&#xff1a;1. 使用https传输 2. 在进行数据传输时进行手动加密&#xff08;app端和后端定义统一的加密方式&#xff09;&#xff0c;这…

Java 线程 笔记(1)

线程是一个程序内部的顺序控制流 线程和进程的区别&#xff1a; 1. 每个进程都有独立的代码和数据空间&#xff08;进程上下文&#xff09;&#xff0c;进程间的切换会有较大的开销 2. 线程可以看成是轻量级的进程&#xff0c;同一类的线程共享代码和数据空间&#xff0c;每个…

smartcrop.js智能图片裁剪库

今天将为大家介绍一款近期github上很不错的开源库 – smartcrop.js。它是一款图片处理的智能裁剪库。在很多项目开发中&#xff0c;经常会遇见上传图片的场景&#xff0c;它可能是用户照片信息&#xff0c;也可能是商品图片等。然而在网页布局中&#xff0c;为了更好的用户体验…

golang 解析php序列化,golang实现php里的serialize()和unserialize()序列和反序列方法详解...

Golang 实现 PHP里的 serialize() 、 unserialize()安装go get -u github.com/techleeone/gophp/serialize用法package mainimport ("fmt""github.com/techleeone/gophp/serialize")func main() {str : a:1:{s:3:"php";s:24:"世界上最好的语…

HotSpot模板解释器目标代码生成过程源码分析

虽然说解释执行模式是逐字逐句翻译给目标平台运行的&#xff0c;但这样的过程未免太过缓慢&#xff0c;如果能把字节码说的话做成纸条&#xff0c;运行时只要把对应的纸条交给目标平台就可以了&#xff0c;这样&#xff0c;执行速度就会明显提升。JVM的Hotspot虚拟机的模板解释…

flex--unable to transcode image

很低级的解决啊&#xff0c;把那个.png文件用画图打开后&#xff0c;重新用png格式保存了下就好咧。。。 转载于:https://www.cnblogs.com/avenxia/archive/2012/04/24/2468334.html

svn服务器发生变更,如何切换

参考链接&#xff1a; https://blog.csdn.net/jk110333/article/details/9301283 https://blog.csdn.net/emtit2008/article/details/51498012 svn switch --relocate svn://旧IP地址/项目 svn://新IP地址/项目 如果是windows客户端,直接在工作副本上右键&#xff0c;选择Torto…

泛型java博客园,Java深度历险之Java泛型

Java泛型(generics)是JDK 5中引入的一个新特性&#xff0c;允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK 5中的新集合类框架中。对于泛型概念的引入&#xff0c;开发社区的观点是褒贬不一。从好…

EXCEL-XML 代码相对行列转换绝对

这段时间因为工作的要求&#xff0c;需要在程序中处理xml 格式的excel 文档。但是在期间遇到了一个问题就是Row 和 Cell 的index 属性相对绝对的问题。 之前在bing 找了一下没找到介绍相对转换成绝对的资料。在经过多次的尝试和对比在空白的文档中不同的cell 中输入值后的XML文…

Integer 和 int 比较的特殊之处

2019独角兽企业重金招聘Python工程师标准>>> 第一个例子&#xff1a; 假设我们同时定义 int a 3; int b 3; 编译器先处理int a 3&#xff1b; 首先它会在栈中创建一个变量为a的引用&#xff0c;然后查找栈中是否有3这个值&#xff0c;如果没找到&#xff0c;就…

偷偷mark下一个

java书单thinking in java java战 Effective Java 深入了解JVM虚拟机 java性能优化权威指南 JSR133 Google Guava官方教程版权声明&#xff1a;本文博主原创文章&#xff0c;博客&#xff0c;未经同意不得转载。 转载于:https://www.cnblogs.com/hrhguanli/p/4915607.html

unix odbc php 连接sqlserver,Ubuntu下通过unixODBC连接MS SqlServer2005

一、下载相关软件 unixODBC、freetds(1) Linux系统的ODBC unixODBC-2.2.8.tar.gz (http://www.unixodbc.org)(2) 连接SQLServer或Sybase的驱动 freetds-0.62.4.tar.gz (http://www.freetds.org)二、安装和配置(1) 安装unixODBC# tar vxzf unixODBC-2.2.8.tar.gz# cd un…

Apache htpasswd命令

一、简介 htpasswd是apache的一个工具&#xff0c;该工具主要用于建立和更新存储用户名、密码的文本文件&#xff0c;主要用于对基于http用户的认证。 二、语法 Usage:htpasswd [-cimBdpsDv] [-C cost] passwordfile usernamehtpasswd -b[cmBdpsDv] [-C cost] passwordfile use…

l2-22(重排链表)

题目链接&#xff1a;https://pintia.cn/problem-sets/994805046380707840/problems/994805057860517888 题意&#xff1a;给定链表L1->L2->...->Ln&#xff0c;要求按Ln->L1->Ln-1->L2->...的格式输出。 思路&#xff1a;水模拟&#xff0c;按照要求做就…

深入研究敏捷的成功因素

Scott W. Ambler针对Dr. Dobbs网站上发布的敏捷成功因素进行了一些分析讨论&#xff0c;那些敏捷成功因素来自2011年11月的敏捷现状调查结果。据此文所说&#xff0c;此次调查的两个目标是&#xff1a; 为了探索与敏捷项目成功有关的实施策略&#xff0c;例如对单一敏捷团队的行…

php 多条数据更新数据类型,PHPdoc @param中的两个或多个数据类型

好的,我有这个phpdoc上面的我的类方法/*** this a function that translates the text* param string|boolean $lang if string the string given in the parameter will be the language code that will represent the language desired, if true, this will translate based …

快速构建Spring Cloud工程

spring cloud简介 spring cloud为开发人员提供了快速构建分布式系统的一些工具&#xff0c;包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单&#xff0c;可以在开发人员的电脑上跑。另外说明spring cloud是基于spr…

win10红色警戒黑屏解决

相信很多80&#xff0c;90后的同学们都喜欢在代码之余打打红色警戒 但是苦于win10差劲兼容性&#xff0c;每次下个红色警戒or尤里复仇不是弹框就是黑屏 今天笔者给出一个完美究极解决方案 请注意&#xff1a; 1&#xff01;红色警戒中把Ra2.exe和Game.exe右键兼容性调到Win XP …

html超链接button

1.如果让本页转向新的页面则用&#xff1a; <input typebutton οnclick"window.location.href(连接)"> 2.如果需要打开一个新的页面进行转向&#xff0c;则用&#xff1a; <input typebutton οnclick"window.open(连接)">转载于:https://www…

低版本jdbc连接高版本oracle,转:oracle11g的JDBC连接 URL和之前的版本有一定的区别...

今天安装了oracle11g后&#xff0c;写了JDBC测试程序&#xff0c;一直都连接不上&#xff01;一直找不到原因后来读了一下安装文件中的Readme.txt文档&#xff0c;汗啊&#xff01;这个版本居然把url的访问方式改变了&#xff1a;Some Useful Hints In Using the JDBC Drivers-…

Android studio 获取每次编译apk时的日期

项目中需要获取apk的编译日期&#xff0c;首先肯定是用手动的方式获取&#xff0c;但这样容易遗忘&#xff0c;怎么样通过代码的方式获取呢&#xff1f; 其实android 为我们提供了一个BuildConfig的类&#xff0c;android 每次编译的时候都会自动生成 一次BuildConfig 类&#…

明文存密码成惯例?Facebook 6 亿用户密码可被 2 万员工直接看

近日&#xff0c;外媒发布了一份互联网安全的调研报告&#xff0c;报告中称Facebook曾将6亿用户的账号密码使用明文存储&#xff0c;且可以被Facebook内部员工随意搜索查看。据Facebook方面的消息人士称&#xff0c;纯文本存档的用户密码可追溯到2012年&#xff0c;在这期间有超…