lintr


Ⅰ. 插件描述

Static Code Analysis for R

Ⅱ. 基本信息

创建日期:  2014-09-28
使用用户:  4
Github星:  698
插件作者:  Jim Hester

Ⅲ. 安装方法

使用Vundle管理器安装

在你的.vimrc下添加:
Plugin 'jimhester/lintr'
… 然后在Vim中运行以下命令:
:source %
:PluginInstall

对于Vundle版本 < 0.10.2,请用上面的Bundle替换Plugin。

使用NeoBundle管理器安装

在你的.vimrc下添加:
NeoBundle 'jimhester/lintr'
… 然后在Vim中运行以下命令:
:source %
:NeoBundleInstall

使用VimPlug管理器安装

在你的.vimrc下添加:
Plug 'jimhester/lintr'
… 然后在Vim中运行以下命令:
:source %
:PlugInstall

使用Pathogen管理器安装

在终端中运行以下命令:
cd ~/.vim/bundle
git clone https://github.com/jimhester/lintr

Ⅳ. 文档说明

# lintr
Travis-CI Build Status
codecov.io
CRAN_Status_Badge Join the chat at https://gitter.im/jimhester-lintr/Lobby

Static code analysis for R

lintr is an R package offering static code analysis for R. It checks adherence to a given style, syntax errors and possible semantic issues, see the animation below. In this README find out

lintr

What to do with lintr output?

If you need a bit automatic help for re-styling your code, have a look at the styler package

Available linters

  • Syntax errors: reported by parse.
  • object_usage_linter: check that closures have the proper usage using
    codetools::checkUsage(). Note this runs

base::eval() on the code, so do not use with untrusted code.

  • absolute_path_linter: check that no absolute paths are used (e.g. "/var", "C:\System", "~/docs").
  • nonportable_path_linter: check that file.path() is used to construct safe and portable paths.
  • pipe_continuation_linter: Check that each step in a pipeline is on a new
    line, or the entire pipe fits on one line.
  • assignment_linter: check that <- is always used for assignment
  • camel_case_linter: check that objects are not in camelCase.
  • closed_curly_linter: check that closed curly braces should always be on their
    own line unless they are followed by an else.
  • commas_linter: check that all commas are followed by spaces, but do not
    have spaces before them.
  • commented_code_linter: check that there is no commented code outside of roxygen comments.
  • cyclocomp_linter: check for overly complicated expressions.
  • equals_na_linter: check for x == NA
  • extraction_operator_linter: check that the [[ operator is used when extracting a single
    element from an object, not [ (subsetting) nor $ (interactive use).
  • function_left_parentheses_linter: check that all left parentheses in a
    function call do not have spaces before them.
  • implicit_integer_linter: check that integers are explicitly typed using the form 1L instead of 1.
  • infix_spaces_linter: check that all infix operators have spaces around them.
  • line_length_linter: check the line length of both comments and code is less than
    length.
  • no_tab_linter: check that only spaces are used, never tabs.
  • object_length_linter: check that function and variable names are not more than length characters.
  • object_name_linter: check that object names conform to a single naming
    style, e.g. CamelCase, camelCase, snake_case, dotted.case, lowercase,

or UPPERCASE.

  • open_curly_linter: check that opening curly braces are never on their own
    line and are always followed by a newline.
  • paren_brace_linter: check that there is a space between right parenthesis and an opening curly brace.
  • semicolon_terminator_linter: check that no semicolons terminate statements.
  • seq_linter: check for 1:length(...), 1:nrow(...), 1:ncol(...),
    1:NROW(...), and 1:NCOL(...) expressions. These often cause bugs when the

right hand side is zero. It is safer to use seq_len() or seq_along()
instead.

  • single_quotes_linter: check that only single quotes are used to delimit
    string constants.
  • spaces_inside_linter: check that parentheses and square brackets do not have
    spaces directly inside them.
  • spaces_left_parentheses_linter: check that all left parentheses have a space before them
    unless they are in a function call.
  • todo_comment_linter: check that the source contains no TODO comments (case-insensitive).
  • trailing_blank_lines_linter: check there are no trailing blank lines.
  • trailing_whitespace_linter: check there are no trailing whitespace characters.
  • T_and_F_symbol_linter: avoid the symbols T and F (for TRUE and FALSE).
  • undesirable_function_linter: report the use of undesirable functions, e.g. options or sapply and suggest an alternative.
  • undesirable_operator_linter: report the use of undesirable operators, e.g. ::: or <<- and
    suggest an alternative.
  • unneeded_concatenation_linter: check that the c function is not used without arguments nor
    with a single constant.

References

Most of the default linters are based on Hadley Wickham's R Style Guide.

Project Configuration

Lintr supports per-project configuration of the following fields.
The config file (default file name: .lintr) is in Debian Control Field Format.

  • linters - see ?with_defaults for example of specifying only a few non-default linters.
  • exclusions - a list of filenames to exclude from linting. You can use a
    named item to exclude only certain lines from a file.
  • exclude - a regex pattern for lines to exclude from linting. Default is "# nolint"
  • exclude_start - a regex pattern to start exclusion range. Default is "# nolint start"
  • exclude_end - a regex pattern to end exclusion range. Default is "# nolint end"

An example file that uses 120 character line lengths, excludes a couple of
files and sets different default exclude regexs follows.

linters: with_defaults(line_length_linter(120))
exclusions: list("inst/doc/creating_linters.R" = 1, "inst/example/bad.R", "tests/testthat/exclusions-test")
exclude: "# Exclude Linting"
exclude_start: "# Begin Exclude Linting"
exclude_end: "# End Exclude Linting"

With the following command, you can create a configuration file for lintr that ignores all linters that show at least one error:

# Create configuration file for lintr
# Source this file in package root directory

# List here files to exclude from lint checking, as a character vector
excluded_files <- c(
    list.files("data",      recursive = TRUE, full.names = TRUE),
    list.files("docs",      recursive = TRUE, full.names = TRUE),
    list.files("inst/doc",  recursive = TRUE, full.names = TRUE),
    list.files("man",       recursive = TRUE, full.names = TRUE),
    list.files("vignettes", recursive = TRUE, full.names = TRUE)
)

### Do not edit after this line ###

library(magrittr)
library(dplyr)

# Make sure we start fresh
if (file.exists(".lintr")) { file.remove(".lintr") }

# List current lints
lintr::lint_package() %>%
    as.data.frame %>%
    group_by(linter) %>%
    tally(sort = TRUE) %$%
    sprintf("linters: with_defaults(\n    %s\n    dummy_linter = NULL\n  )\n",
            paste0(linter, " = NULL, # ", n, collapse = "\n    ")) %>%
    cat(file = ".lintr")

sprintf("exclusions: list(\n    %s\n  )\n",
        paste0('"', excluded_files, '"', collapse = ",\n    ")) %>%
    cat(file = ".lintr", append = TRUE)

# Clean up workspace
remove(excluded_files)

The resulting configuration will contain each currently failing linter and the corresponding number of hits as a comment. Proceed by successively enabling linters, starting with those with the least number of hits. Note that this requires lintr 0.3.0.9001 or later.

If you are developing a package, you can add ^\.lintr$ to your .Rbuildignore file using usethis::use_build_ignore(".lintr").

Continuous integration

If you want to run lintr on Travis-CI in order to check that commits and pull requests don't deteriorate code style, you will need
to have Travis install the package first. This can be done by adding the
following line to your .travis.yml

r_github_packages:
  - jimhester/lintr

We recommend running lintr::lint_package() as an after_success step in your build process]

lintr-bot will then add comments
to the commit or pull request with the lints found and they will also be
printed on Travis-CI. If you want to disable the commenting you can
set the environment variable LINTR_COMMENT_BOT=false.

Non-failing Lints

after_success:
  - R CMD INSTALL $PKG_TARBALL
  - Rscript -e 'lintr::lint_package()'

Live example of a package using this setup: hibpwned, lintr-bot commenting on a PR.

Installation of development version

To install the latest development version of lintr from GitHub

devtools::install_github("jimhester/lintr")

Editors setup

RStudio

lintr lints are automatically displayed in the RStudio Markers pane, Rstudio versions (> v0.99.206).
RStudio Example

Installation

Install lintr, type install.packages("lintr") in the Console.

In order to show the "Markers" pane in RStudio:
Menu "Tools" -> "Global Options...", a window with title "Options" will pop up. In that window: Click "Code" on the left; Click "Diagnostics" tab; check "Show diagnostics for R".

To lint a source file test.R type in the Console lintr::lint("test.R") and look at the result in the "Markers" pane.

This package also includes two addins for linting the current source and package.
To bind the addin to a keyboard shortcut navigate to Tools > addins >
Browse Addins > Keyboard Shortcuts. It's recommended to use Alt+Shift+L for
linting the current source code and Ctrl+Shift+Alt+L to code the package.
These are easy to remember as you are Alt+Shift+L(int) ;)

Emacs

lintr has built-in integration with flycheck versions greater than 0.23.
Emacs Example

Installation

lintr is fully integrated into flycheck when using ESS. See the
installalation documentation for those packages for more information.

Configuration

You can also configure what linters are used. e.g. using a different line length cutoff.

  • M-x customize-option -> flycheck-lintr-linters -> with_defaults(line_length_linter(120))

Vim

lintr can be integrated with
syntastic for on the fly linting.

Vim Example

Installation

Put the file syntastic/lintr.vim
in syntastic/syntax_checkers/r. If you are using
pathogen this directory is
~/.vim/bundles/syntastic/syntax_checkers/r.

You will also need to add the following lines to your .vimrc.

let g:syntastic_enable_r_lintr_checker = 1
let g:syntastic_r_checkers = ['lintr']

Configuration

You can also configure what linters are used. e.g. using a different line length cutoff.

let g:syntastic_r_lintr_linters = "with_defaults(line_length_linter(120))"

Sublime Text 3

lintr can be integrated with
Sublime Linter for on the fly linting.

Sublime Example

Installation

Simply install sublimeLinter-contrib-lintr using Package Control.

For more information see Sublime Linter Docs

Configuration

You can also configure what linters are used. e.g. disabling the assignment linter and using a different line length cutoff.
In the SublimeLinter User Settings

{
  "linters": {
    "lintr": {
      "linters": "with_defaults(assignment_linter = NULL, line_length_linter(120))"
    }
  }
}

Atom

lintr can be integrated with
Linter for on the fly linting.

Atom Example

Installation

Simply install linter-lintr from within Atom or on the command line with:

apm install linter-lintr

For more information and bug reports see Atom linter-lintr.

添加新评论