16. math.h

C言語ライブラリの一つ、 Rmath.h のインクルードで利用可能。

16.1. 指数・対数

  • log
  • log10
  • log1p
  • log2

指数関数、対数関数はC言語ライブラリの math.h 内に定義されている。 Rmath.h をインクルードすると math.h も読み込まれて利用可能。

返り値はdouble, float, long double とある。 引数は、返り値の型と同じ。

16.2. コード

#include <R.h>
#include <Rinternals.h>
#include <Rdefines.h>
#include <Rmath.h>

SEXP pH(SEXP arg_p) {
    if(!(IS_NUMERIC(arg_p))) {
        error("argument is not numeric");
    }

    if(IS_INTEGER(arg_p)) {
        arg_p = AS_NUMERIC(arg_p);
    }

    SEXP res;

    int len = length(arg_p);

    res = PROTECT(NEW_NUMERIC(len));

    int i = 0;
    for(i; i < len; i++) {

        REAL(res)[i] = - log10(REAL(arg_p)[i]);

    }

    UNPROTECT(1);
    return res;
}
dyn.load("pH.so")

return_pH <- function(vec) {

    .Call("pH", vec)

}

conc <- c(10^-4, 10^-5, 10^-6)

conc_int <- as.integer(conc)

return_pH(conc)
# [1] 4 5 6


return_pH(conc_int)
# return_pH(conc_int) でエラー: argument is not numeric
# 実行が停止されました

return_pH(letters[1:3])
# return_pH(letters[1:3]) でエラー: argument is not numeric, or integer
# 実行が停止されました

16.3. 三角関数

  • cos
  • sin
  • tan
  • acos
  • asin
  • atan

返り値はdouble, float, long double とある。 引数は、返り値の型と同じ。

16.4. コード

#include <R.h>
#include <Rinternals.h>
#include <Rdefines.h>
#include <Rmath.h>

SEXP gen_circ() {
    int len = 100;

    SEXP circ_x, circ_y;
    int circ_row = 100;
    int circ_col = 2;

    double start = -M_PI;
    //double fin = M_PI;
    double plus = 2 * M_PI / 99;


    SEXP circ;
    circ = PROTECT( allocMatrix(REALSXP, circ_row, circ_col) );

    for(int i = 0; i < len; i++) {

        REAL(circ)[i] = sin(start);
        REAL(circ)[i + 100] = cos(start);

        start = start + plus;
    }




    UNPROTECT(1);
    return circ;
}
dyn.load("gen_circ.so")

init_circ <- function() {
    RES <- .Call("gen_circ")

    list(res = data.frame(x = RES[, 1], y = RES[, 2]))
}

library(ggplot2)

g <- ggplot(init_circ()$res) +
    geom_path(aes(x, y))

g
ggsave("unit_circle.png")
../_images/unit_circle.png

16.5. 定数

定数名 定数
M_E ネイピア数
M_LOG2E log2(e)
M_LOG10E log10(e)
M_LN2 ln(2)
M_LN10 ln(10)
M_PI pi
M_2PI pi/2
M_PI_4 pi/4
M_1_PI 1/pi
M_2_PI 2/pi
M_2_SQRTPI 2/sqrt(pi)
M_SQRT2 sqrt(2)
M_SQRT1_2 1/sqrt(2)
M_SQRT_3 sqrt(2)
M_SQRT_32 sqrt(32)
M_LOG10_2 log10(2)
M_SQRT_PI sqrt(pi)
M_1_SQRT_2PI 1/sqrt(2pi)
M_SQRT_2dPI sqrt(2/pi)
M_LN_2PI log(2*pi)
M_LN_SQRT_PI log(sqrt(pi))
M_LN_SQRT_2PI log(sqrt(2*pi))
M_LN_SQRT_PId2 log(sqrt(pi/2))

16.6. コード

#include <R.h>
#include <Rinternals.h>
#include <Rdefines.h>
#include <Rmath.h>

SEXP return_pi() {
    SEXP res;
    res = PROTECT(NEW_NUMERIC(1));

    NUMERIC_POINTER(res)[0] = M_PI;

    UNPROTECT(1);
    return res;
}
dyn.load("return_pi.so")

.Call("return_pi")
# [1] 3.141593