R(1)基本文法

基本パッケージとその文法

Computation
R
Author

司馬 博文

Published

5/07/2021

Modified

6/07/2024

概要
R は統計計算のための言語です.
  1. 全ては関数である.
  2. 全てはベクトルであり,複雑な構造は dispatch の賜物である.

1 基本

1.1 対話モード

バッチ処理はR CMD BATCH file.zで行う.

When a user types a command at the prompt (or when an expression is read from a file) the first thing that happens to it is that the command is transformed by the parser into an internal representation. The evaluator executes parsed R expressions and returns the value of the expression. All expressions have a value. This is the core of the language. – R Language Definition

  • R:どこからでも対話モードで実行可能なのが R.
  • [1]はすぐ隣の要素の index.ALGOL 系と違い,1から index する.
    • ベクトルは基本横で[1]という行の名前の後に表示される,行列の行は[1,]と indexing される.indexing の表示の違いでクラスの違いがわかる.
x <- c(10, 20, 30, 40)
x
[1] 10 20 30 40
mat <- matrix(1:6, nrow = 2)
mat
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
  • 関数名直打ちは定義が帰ってくる.
sum
function (..., na.rm = FALSE)  .Primitive("sum")
  • ()も,直打ちも,generic function の神である print 関数を呼んでいる.
x <- 42
x
[1] 42
(x)
[1] 42
  • working directory の概念がある.
    • getwd(), setwd()

1.2 関数

  • keyword をつけて呼び出せるが,位置が正しければ省略可能
    • f(arg1=value1, arg2=value2)
  • R は 関数型言語 で,全ての実装は関数になっている.が,認知容易性のために予約語として実装された特殊文字を用いて,中置記法が使える.
    • +などの二項演算子は”+”(1,2)として使える.
    • inなどの Condition Flow の宣言っぽい演算子も実装は関数.
`+`(1, 2)
[1] 3
1 %in% c(1, 2, 3)
[1] TRUE
  • 関数適用の大原則:リサイクル

    logical の==も,matrix(3,3,3)も recycle される.

    • (1,2,3) == (2,3,4)はベクトルの同一性を表さず,(F,F,F)を返し,matrix(3,3,3)は3でrecycleされた3×3行列.
c(1, 2, 3) + c(4, 5)
Warning in c(1, 2, 3) + c(4, 5): longer object length is not a multiple of
shorter object length
[1] 5 7 7
c(1, 2, 3) == c(2, 3, 4)
[1] FALSE FALSE FALSE
matrix(3, nrow = 3, ncol = 3)
     [,1] [,2] [,3]
[1,]    3    3    3
[2,]    3    3    3
[3,]    3    3    3

1.3 オブジェクト操作

?Syntaxで演算の速さなどがわかる.

  • 代入
    • foo <- objectまたはobject -> foo
    • <<-は再帰的代入
      • 関数の中でしか使われず,親 environment やグローバル環境の中からも右辺を探す.右辺が見つかったら再びそれを代入する.
    • =は代入もできる

    the operator = is only allowed at the top level (e.g., in the complete expression typed at the command prompt) or as one of the subexpressions in a braced list of expressions.

foo <- 1

change_foo <- function() {
  foo <<- foo + 1
}

change_foo()
print(foo)
[1] 2
  • evaluetion
    • (object)
      • print(object) と等価.console だと裸で良い.
  • ;
    • 命令の併記
x <- 1; y <- 2; z <- x + y
print(z)
[1] 3
  • 変数名に数字が使えるのいいな.
    • 語頭は数字にはできない.
R Language Definition
Operator Description
- Minus, can be unary or binary
+ Plus, can be unary or binary
! Unary not
~ Tilde, used for model formulae, can be either unary or binary
? Help
: Sequence, binary (in model formulae: interaction)
* Multiplication, binary
/ Division, binary
^ Exponentiation, binary
%x% Special binary operators, x can be replaced by any valid name
%% Modulus, binary
%/% Integer divide, binary
%*% Matrix product, binary
%o% Outer product, binary
%x% Kronecker product, binary
%in% Matching operator, binary (in model formulae: nesting)
%||% Null coalescing operator, binary
< Less than, binary
> Greater than, binary
== Equal to, binary
>= Greater than or equal to, binary
<= Less than or equal to, binary
& And, binary, vectorized
&& And, binary, not vectorized
| Or, binary, vectorized
|| Or, binary, not vectorized
<- Left assignment, binary
-> Right assignment, binary
$ List subset, binary

2 制御

  • {suite}:ブロック

    ブロックは閉じるまで評価されない.

    { x <- 0
    x + 5
    }
    [1] 5
  • if, else, else if:条件分岐

    if ( statement1 )
        statement2
    else
        statement3
  • for, while, repeat:反復

    for ( name in vector ) {
        statement
    }
    while ( statement1 ) {
        statement2
    }
    repeat {
        statement
        if ( condition ) break
    }
  • switch (statement, list)statementを評価した結果得る数値を用いて,listを indexing して(評価して)返す.

    • switchは関数として実装されているが,「評価」のステップがあるために制御構文として使える.
    x <- 3
    switch(x, 2+2, mean(1:10), rnorm(5))
    [1] -1.21239418 -0.42072586  0.93179085  0.70058355  0.03332041
    switch(2, 2+2, mean(1:10), rnorm(5))
    [1] 5.5

関数型言語なので,forもifもfunctionも関数だと思った方がいい.()と{}を取り,{}はブロックの意味しか持たず,改行を挟まないなら省略して良い.(C, C++, Python, PerlなどのALGOL系と全く同じ).文は改行文字かセミコロンで区切る. なるべく制御(再帰構造)を避けるのが関数型言語としての目標になる.

Control 多分if(cond)というのは引数だ.全ての関数は引数を離して書いても良い.$も同様. 改行を経ないexprの併記は;を用いる.{}は改行を超えてコンパイラにまとまりを通知する.インデントは視認性以外の意味はなさそう.

  • if節
    • 構文:if(Cond) {expr} else {expr}
      • Condとは長さ1のlogical vectorに評価可能なobject
      • いずれの{}もなくても動くが,行を分けたいなら必要.document読む限りつけるのが推奨されている.
    • ifelse(test, yes, no):testには条件式(logical型に変換可能なobject),yes/noには返すすべき文字列.
      • ifelseにはない.
  • for文
    • 構文:for(var in seq) expr
      • seqは最初に評価される.
      • length(seq)=0ならすぐにloopが終わる
      • inは特別なControl Flowのための予約語.
  • while文
    • 構文:while(Cond) expr
  • その他
    • repeat expr
    • break:loopの外の最初の文に制御を移す
    • next

valueについて:全部静かに返り値を返している * ifはcondの評価の結果をlogicalを返す * for, while, repeatはNULLを返す * break, nextはloopの中で制御を移すので,返り値は持たない.

3 関数定義

function object を返す constructor

function(arglist) expr [return(value)] - arglistはname=exprの形のexpressionも許容. - exprの中に前の引数を入れてさえ良い. - 参照時,名前つき引数指定 option = value では、引数名 option は一意的に決定される限り、先頭の文字列だけを与えるだけで良い!!!何それwww - returnが関数とは.関数型言語 - valueもexpressionで良い. - returnを省略すると,最後になされた評価の値が返される.通常は実行時間が速くなるので省略されるが可読性は下がるかも. - valueを省略するとNULLが返される.

リストを引数として受け入れたい * 特殊引数… * この後に定義された引数は,keyword付きで参照しないとエラーになる.