言語エンジンeng_langの環境設定

Rプログラム eng_lang_setup.R は knit の紹介サイト https://yihui.org/knitr/ の engine.R を参考にして作成した.

source("eng_lang_setup.R")
## === knitr, reticulate, eng_lang are go. ===

標準エンジンの使用例

Rの実行

  • {r, engine=“R”}
x <- 1:5
x
## [1] 1 2 3 4 5
str(x)
##  int [1:5] 1 2 3 4 5

perlの実行

  • {perl}
$test = "jellow world";
$test =~ s/j/h/;
print $test
## hellow world

Maximaの実行

  • {bash}
echo  '
(linel:70)$                  /* 行長を指定(コメント例) */
exp1 : (x+y)^2;              /* 式の定義 */
exp2 : expand(exp1);         /* 式exp1を展開 */
(display2d:false)$           /* 表示形式の変更 */
factor(exp2);                /* 式exp2を因数分解 */
solve(x^2-2*x-1=0,x);        /* 2次方程式の求解 */
solve([a*x+b*y=e,c*x+d*y=f],[x,y]);  /* 連立方程式の求解 */
/* 作図例 */
plot2d([sin(x),cos(x)],[x,-2*%pi,2*%pi],
       [gnuplot_term,png],[gnuplot_out_file,"eng_lang_setup_ex_files/fig-m1.png"]);
' > tmp_lang/tmp.mx
maxima -b tmp_lang/tmp.mx
## Maxima 5.42.2 http://maxima.sourceforge.net
## using Lisp GNU Common Lisp (GCL) GCL 2.6.12
## Distributed under the GNU Public License. See the file COPYING.
## Dedicated to the memory of William Schelter.
## The function bug_report() provides bug reporting information.
## (%i1) batch("tmp_lang/tmp.mx")
## 
## read and interpret file: #p/var/www/html/LANG/tmp_lang/tmp.mx
## (%i2) linel:70
## (%i3) exp1:(x+y)^2
##                                       2
## (%o3)                          (y + x)
## (%i4) exp2:expand(exp1)
##                             2            2
## (%o4)                      y  + 2 x y + x
## (%i5) display2d:false
## (%i6) factor(exp2)
## (%o6) (y+x)^2
## (%i7) solve(x^2-2*x-1 = 0,x)
## (%o7) [x = 1-sqrt(2),x = sqrt(2)+1]
## (%i8) solve([a*x+b*y = e,c*x+d*y = f],[x,y])
## (%o8) [[x = -(d*e-b*f)/(b*c-a*d),y = (c*e-a*f)/(b*c-a*d)]]
## (%i9) plot2d([sin(x),cos(x)],[x,(-2)*%pi,2*%pi],[gnuplot_term,png],
##              [gnuplot_out_file,"eng_lang_setup_ex_files/fig-m1.png"])
## (%o9) ["/tmp/maxout1363.gnuplot_pipes",
##        "eng_lang_setup_ex_files/fig-m1.png"]
## (%o9) "tmp_lang/tmp.mx"

写真
図1. eng_lang_setup_ex_files/fig-m1.png

標準エンジンを用いたpythonとRの連携

  • {python}
a = 7
print(a)
## 7
  • {r, engine=“R”}
py$a
## [1] 7

追加エンジン lang を使用

チャンクの記法

  {lang ラベル, ext="f", stdin="tmp_lang/data.in", eval=TRUE, echo=TRUE, ...}

作業ディレクトリ tmp_lang/ において,ファイル ラベル.f(ファイル拡張子はextで指定する) を作成し, FORTRANソースコードとして コンパイル&実行 を行う. 実行時に,入力要求されるデータは stdin で指定されたファイルから読み込まれる. つづく引数 eval=TRUE, echo=TRUE, … はRMarkDownで用意されている引数である.
拡張子ext に指定できる計算機言語としては以下が用意されている.

bash -> bash,  c -> c,       f -> FORTRAN,  f95 -> FORTRAN95,  mx|mac -> Maxima
pas -> Pascal, perl -> Perl, py -> Python,  py3 -> Python3,    
r|R -> R,      sh -> sh,     in|data -> データ入力
sage -> sage,  sagem -> sage -maxima, sagep -> sage -python, sager -> sage -R  

extは省略不可の引数である. ラベルは省略するとknitrによってunnamed-chunk-??といったチャンク名が割り振られるが,作業ディレクトリ内ではunnamed-は省略したファイルを生成する. 引数stdinは不用な場合は省略できる. ラベルを省略するときは

  {lang , ext="f", eval=TRUE, echo=TRUE, comment="##", ...}  # lang の後のカンマを忘れないこと

とする.

pythonとRの連携 (lang エンジンを使用して)

  • {lang , ext=“py”}
a = 7
print(a)
## /home/inoue/bin/go tmp_lang/chunk-6.py  > tmp_lang/chunk-6.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-6.py 
## 7
  • {lang, ext=“r”} 機能せず(open problem!!)
py$a
## /home/inoue/bin/go tmp_lang/chunk-7.r  > tmp_lang/chunk-7.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-7.r 
## > py$a
##  エラー:  オブジェクト 'py' がありません 
##  実行が停止されました
  • {r, engine=“R”} 機能する
py$a
## [1] 7

追加されたエンジン lang では “pythonとRの連携”は機能しない.しかしながら幸いにして lang を追加しても標準エンジン {r, engine=“R”} が使用できるので一応はセーフとする.

bash

  • {lang , ext=“bash”}
date
ls *.csv
## /home/inoue/bin/go tmp_lang/chunk-9.bash  > tmp_lang/chunk-9.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-9.bash 
## 2020年  4月 13日 月曜日 08:18:42 JST
## flights.csv

Perl

  • {lang, ext=“perl”}
$test = "jellow world";
$test =~ s/j/h/;
print $test
## /home/inoue/bin/go tmp_lang/chunk-10.perl  > tmp_lang/chunk-10.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-10.perl 
## hellow world

Python (データファイル flights.csv を使用する)

  • {lang ,ext=“py”, eval=TRUE, echo=TRUE}
import pandas
flights = pandas.read_csv("flights.csv")
flights = flights[flights['dest'] == "ORD"]
flights = flights[['carrier', 'dep_delay', 'arr_delay']]
flights = flights.dropna()
print flights.head(3)
print flights.tail(3)
flights
## /home/inoue/bin/go tmp_lang/chunk-11.py  > tmp_lang/chunk-11.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-11.py 
##    carrier  dep_delay  arr_delay
## 4       UA       -4.0       12.0
## 5       AA       -2.0        8.0
## 22      AA       -1.0       14.0
##        carrier  dep_delay  arr_delay
## 160714      AA      -12.0      -37.0
## 160725      UA       -7.0      -13.0
## 160741      AA      -13.0      -38.0
  • {lang ,ext=“py3”, eval=TRUE, echo=TRUE}
# python3
# coding: utf-8
for j in range(1,8):
   print('ひつじが'+str(j)+'匹')
## /home/inoue/bin/go tmp_lang/chunk-12.py3  > tmp_lang/chunk-12.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-12.py3 
## ひつじが1匹
## ひつじが2匹
## ひつじが3匹
## ひつじが4匹
## ひつじが5匹
## ひつじが6匹
## ひつじが7匹

Fortran

  • データ {lang tmp, ext=“in”, eval=TRUE, echo=TRUE}
5
11 12 13 14 15
## /home/inoue/bin/go tmp_lang/tmp.in  > tmp_lang/tmp.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/tmp.in 
## Input Data File: /var/www/html/LANG/tmp_lang/tmp.in 
## 5
## 11 12 13 14 15
  • プログラム {lang ,ext=“f”, stdin=“tmp_lang/tmp.in” , echo=TRUE}
c------program stat1f : av and sd
      program stat1f
      parameter (nmax=100)
      dimension x(nmax)
      write(6,*)"?-<n : # of data> ="
c     ファイルの読み込み(status="old"),書き込み(status="replace")
c      open(5,file="/tmp/lang/tmp.in",status="old",err=999)
      read(5,*) n
      if (n > nmax) then 
         write(6,*)"Error: n > nmax"
         stop
         end if
      write(6,*)"?-<data: x(i),i=1,n> ="
      read(5,*)(x(i),i=1,n)
        write(6,*)"n =",n
        write(6,*)"{x(i),i=1,n}",(x(i),i=1,n)
      sum = 0.0
      do 100 i=1,n
          sum = sum + x(i)
  100 continue
      av = sum/n
      sum = 0.0
      do 200 i=1,n
         sum = sum + (x(i)-av)**2
  200 continue
      var = sum/n; sd = sqrt(var)
      write(6,*)" av = ",av,
     1 " , var = ", var, " , sd = ",sd
      stop
  999 write(6,*)"Error in file-open"
      end
## /home/inoue/bin/go tmp_lang/chunk-13.f  < tmp_lang/tmp.in > tmp_lang/chunk-13.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-13.f 
## Compile: gfortran chunk-13.f -o chunk-13 > chunk-13.log 2>&1 || err=1
## Execute: ./chunk-13      
##  ?-<n : # of data> =
##  ?-<data: x(i),i=1,n> =
##  n =           5
##  {x(i),i=1,n}   11.0000000       12.0000000       13.0000000       14.0000000       15.0000000    
##   av =    13.0000000      , var =    2.00000000      , sd =    1.41421354

Pascalの実行例

  • {lang , ext=“pas”, stdin=“tmp_lang/tmp.in”, echo=TRUE}
{======================================================
stat1p : av, var, sd
======================================================}
program stat1p;
   const nmax=100; pmax=10;
   type vecr = array[1..nmax] of real;
   var i,n : integer;
       sum, av, var0, sd : real;
       x : vecr;
begin { of stat1p}
  writeln('run : stat1p.pas');
  write('?-<n : # of data> = '); readln(n);
  writeln('?-<x[i], i=1,n> ='); 
  for i:=1 to n do read(x[i]);
  sum := 0.0;
  for i:=1 to n do begin
      sum := sum + x[i];
  end;
  av := sum/n;
  sum := 0.0;
  for i:=1 to n do begin
    sum := sum + (x[i]-av)*(x[i]-av);
  end;
  var0 := sum/n;
  sd := sqrt(var0);
  writeln('n =',n:4,' ,av = ',av:8:3, ' , var0 = ',var0:8:3, ' , sd = ',sd:8:3);
end. {of stat1p}
## /home/inoue/bin/go tmp_lang/chunk-14.pas  < tmp_lang/tmp.in > tmp_lang/chunk-14.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-14.pas 
## Complie & Execute: fpc -Tlinux  /var/www/html/LANG/tmp_lang/chunk-14.pas ; /var/www/html/LANG/tmp_lang/chunk-14
## Free Pascal Compiler version 3.0.4+dfsg-18ubuntu2 [2018/08/29] for x86_64
## Copyright (c) 1993-2017 by Florian Klaempfl and others
## Target OS: Linux for x86-64
## Compiling /var/www/html/LANG/tmp_lang/chunk-14.pas
## Linking /var/www/html/LANG/tmp_lang/chunk-14
## /usr/bin/ld.bfd: 警告: link.res には出力セクションが含まれます。-T オプションを忘れていませんか?
## 27 lines compiled, 0.1 sec
## run : stat1p.pas
## ?-<n : # of data> = ?-<x[i], i=1,n> =
## n =   5 ,av =   13.000 , var0 =    2.000 , sd =    1.414

Cの実行例

  • {lang , ext=“c”, stdin=“tmp_lang/tmp.in”, echo=TRUE}
/* stat1c : av & sd for one dimension       1994-08-02   by T.INOUE */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NMAX 100
int main()
{
  int i, n;
  float av, var, sd, x[NMAX+1];
  printf(" ?-<n : # of data> = "); scanf("%d",&n);
  if (n > NMAX) exit(1);
  printf(" ?-<x[i], i=1,n> =");
  for (i=1; i<=n; ++i)
    { scanf("%f",&x[i]);}
  av = 0.0;
  for (i=1; i<=n; ++i) {av = av + x[i];} av = av / n;
  var = 0.0;
  for (i=1; i<=n; ++i) {var = var + (x[i]-av)*(x[i]-av);} var = var / n;
  sd = sqrt(var); 
  printf("\n AV. = %f   Var. = %f  S.D. = %f \n", av, var, sd);
}
## /home/inoue/bin/go tmp_lang/chunk-15.c  < tmp_lang/tmp.in > tmp_lang/chunk-15.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-15.c 
## Compile & Execute: gcc -std=c90 /var/www/html/LANG/tmp_lang/chunk-15.c -lm -o /var/www/html/LANG/tmp_lang/chunk-15; /var/www/html/LANG/tmp_lang/chunk-15
##  ?-<n : # of data> =  ?-<x[i], i=1,n> =
##  AV. = 13.000000   Var. = 2.000000  S.D. = 1.414214

Rの実行例

  • {lang ,ext=“r”}の場合
x <- c(11,12,13,14,15)   # データ
mean(x)                  # 平均
var(x)                   # 分散(不偏分散)
n <- length(x); var0 <- var(x)*(n-1)/n; var0
sd(x)                    # 標準偏差
sd0 <- sqrt(var0); sd0
png("eng_lang_setup_ex_files/fig1.png")
hist(x)                  # 作図は自動生成されない(前後の2行で手動指定する)
dev.off()
## /home/inoue/bin/go tmp_lang/chunk-16.r  > tmp_lang/chunk-16.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-16.r 
## > x <- c(11,12,13,14,15)   # データ
## > mean(x)                  # 平均
## [1] 13
## > var(x)                   # 分散(不偏分散)
## [1] 2.5
## > n <- length(x); var0 <- var(x)*(n-1)/n; var0
## [1] 2
## > sd(x)                    # 標準偏差
## [1] 1.581139
## > sd0 <- sqrt(var0); sd0
## [1] 1.414214
## > png("eng_lang_setup_ex_files/fig1.png")
## > hist(x)                  # 作図は自動生成されない(前後の2行で手動指定する)
## > dev.off()
## null device 
##           1 
## >
eng_lang_setup_ex_files/fig1.pngのグラフ

eng_lang_setup_ex_files/fig1.pngのグラフ

  • {r ,engine=“R”}の場合
x <- c(11,12,13,14,15)   # データ
mean(x)                  # 平均
## [1] 13
var(x)                   # 分散(不偏分散)
## [1] 2.5
n <- length(x); var0 <- var(x)*(n-1)/n; var0
## [1] 2
sd(x)                    # 標準偏差
## [1] 1.581139
sd0 <- sqrt(var0); sd0
## [1] 1.414214
hist(x)                  # 作図は自動生成される

Maximaの実行例1

  • {lang ,ext=“mx” }
(linel:70)$                  /* 行長を指定(コメント例) */
exp1 : (x+y)^2;              /* 式の定義 */
exp2 : expand(exp1);         /* 式exp1を展開 */
(display2d:false)$           /* 表示形式の変更 */
factor(exp2);                /* 式exp2を因数分解 */
solve(x^2-2*x-1=0,x);        /* 2次方程式の求解 */
solve([a*x+b*y=e,c*x+d*y=f],[x,y]);  /* 連立方程式の求解 */
/* 作図例 */
plot2d([sin(x),cos(x)],[x,-2*%pi,2*%pi],
       [gnuplot_term,png],[gnuplot_out_file,"eng_lang_setup_ex_files/fig2.png"]);
## /home/inoue/bin/go tmp_lang/chunk-18.mx  > tmp_lang/chunk-18.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-18.mx 
## batch("/var/www/html/LANG/tmp_lang/chunk-18.mx")
## read and interpret file: #<input stream #p/var/www/html/LANG/tmp_lang/chunk-18.mx>
## linel:70
## exp1:(x+y)^2
##                                       2
##                                (y + x)
## exp2:expand(exp1)
##                             2            2
##                            y  + 2 x y + x
## display2d:false
## factor(exp2)
## (y+x)^2
## solve(x^2-2*x-1 = 0,x)
## [x = 1-sqrt(2),x = sqrt(2)+1]
## solve([a*x+b*y = e,c*x+d*y = f],[x,y])
## [[x = -(d*e-b*f)/(b*c-a*d),y = (c*e-a*f)/(b*c-a*d)]]
## plot2d([sin(x),cos(x)],[x,(-2)*%pi,2*%pi],[gnuplot_term,png],
##        [gnuplot_out_file,"eng_lang_setup_ex_files/fig2.png"])
## ["/tmp/maxout1707.gnuplot_pipes","eng_lang_setup_ex_files/fig2.png"]
## "/var/www/html/LANG/tmp_lang/chunk-18.mx"

写真
図2. fig2.png

Maximaの実行例2

  • {lang, ext=“mx”}
(load(draw), display2d:false, linel:70)$
f : expand((x-1)*(x-3)*(x-6))$
for i:1 thru 3 do ( define(t[i](x,x0), taylor(f,x,x0,i)) );
g1 : gr2d(xrange = [0,6.5], yrange = [-10, 10], grid=true,  
          font="Arial", font_size=24,
          title="x0 = 2",
          color=red, key="f(x)", explicit(f, x, 0, 6.5),
          color=blue,key="f1(x)",explicit(t[1](x,2), x, 0, 6.5),
          color=green,key="f2(x)",explicit(t[2](x,2),x,0,6.5)  )$
g2 : gr2d(xrange = [0,6.5], yrange = [-10, 10], grid=true,
          title="x0=3",  
          color=red, key="f(x)", explicit(f, x, 0, 6.5),
          color=blue,key="f1(x)",explicit(t[1](x,3), x, 0, 6.5),
          color=green,key="f2(x)",explicit(t[2](x,3),x,0,6.5)  )$
draw(terminal=png, file_name="eng_lang_setup_ex_files/fig3",columns=2, 
     dimensions=[1000,400], g1,g2)$
## /home/inoue/bin/go tmp_lang/chunk-19.mx  > tmp_lang/chunk-19.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-19.mx 
## batch("/var/www/html/LANG/tmp_lang/chunk-19.mx")
## read and interpret file: #<input stream #p/var/www/html/LANG/tmp_lang/chunk-19.mx>
## (load(draw),display2d:false,linel:70)
## f:expand((x-1)*(x-3)*(x-6))
## for i thru 3 do define(t[i](x,x0),taylor(f,x,x0,i))
## done
## g1:gr2d(xrange = [0,6.5],yrange = [-10,10],grid = true,
##         font = "Arial",font_size = 24,title = "x0 = 2",color = red,
##         key = "f(x)",explicit(f,x,0,6.5),color = blue,key = "f1(x)",
##         explicit(t[1](x,2),x,0,6.5),color = green,key = "f2(x)",
##         explicit(t[2](x,2),x,0,6.5))
## g2:gr2d(xrange = [0,6.5],yrange = [-10,10],grid = true,
##         title = "x0=3",color = red,key = "f(x)",explicit(f,x,0,6.5),
##         color = blue,key = "f1(x)",explicit(t[1](x,3),x,0,6.5),
##         color = green,key = "f2(x)",explicit(t[2](x,3),x,0,6.5))
## draw(terminal = png,file_name = "eng_lang_setup_ex_files/fig3",
##      columns = 2,dimensions = [1000,400],g1,g2)
## "/var/www/html/LANG/tmp_lang/chunk-19.mx"

写真
図3. fig3.png

sageの実行例1

  • {lang , ext=“sage”}
a = factor(2014)
print a
pi
print n(pi)
print n(pi,digits=30)
print (1+2*I)^2
fig1 = plot(sin(x),(x,-pi,pi))
#show(fig1)
fig1.save('eng_lang_setup_ex_files/fig-s1.png')
## /home/inoue/bin/go tmp_lang/chunk-20.sage  > tmp_lang/chunk-20.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-20.sage 
## 2 * 19 * 53
## 3.14159265358979
## 3.14159265358979323846264338328
## 4*I - 3
eng_lang_setup_ex_files/fig-s1.pngのグラフ

eng_lang_setup_ex_files/fig-s1.pngのグラフ

sagem : sage -maxima

  • {lang , ext=“sagem”}
exp : (x+y)^3;
expand(exp);
taylor(sin(x),x,0,7);
## /home/inoue/bin/go tmp_lang/chunk-21.sagem  > tmp_lang/chunk-21.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-21.sagem 
## ;;; Loading #P"/usr/lib/ecl-16.1.2/sb-bsd-sockets.fas"
## ;;; Loading #P"/usr/lib/ecl-16.1.2/sockets.fas"
## ;;; Loading #P"/usr/lib/ecl-16.1.2/defsystem.fas"
## ;;; Loading #P"/usr/lib/ecl-16.1.2/cmp.fas"
## Maxima 5.39.0 http://maxima.sourceforge.net
## using Lisp ECL 16.1.2
## Distributed under the GNU Public License. See the file COPYING.
## Dedicated to the memory of William Schelter.
## The function bug_report() provides bug reporting information.
## (%i1) 
##                                           3
## (%o1)                              (y + x)
## (%i2) 
##                             3        2      2      3
## (%o2)                      y  + 3 x y  + 3 x  y + x
## (%i3) 
##                                3    5      7
##                               x    x      x
## (%o3)/T/                  x - -- + --- - ---- + . . .
##                               6    120   5040
## (%i4)

sagep : sage -python (データファイル flights.csv を使用する)

  • {lang , ext=“sagep”}
import pandas
flights = pandas.read_csv("flights.csv")
flights = flights[flights['dest'] == "ORD"]
flights = flights[['carrier', 'dep_delay', 'arr_delay']]
flights = flights.dropna()
print flights.head(3)
print flights.tail(3)
flights
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.cos(2*np.pi*t)
#print t.head(3)
#print s.head(3)
plt.plot(t, s)
plt.xlabel('times (s)')
plt.ylabel('voltage (mV)')
plt.grid(True)
plt.savefig("eng_lang_setup_ex_files/py1.png")
#plt.show()
## /home/inoue/bin/go tmp_lang/chunk-22.sagep  > tmp_lang/chunk-22.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-22.sagep 
##    carrier  dep_delay  arr_delay
## 4       UA       -4.0       12.0
## 5       AA       -2.0        8.0
## 22      AA       -1.0       14.0
##        carrier  dep_delay  arr_delay
## 160714      AA      -12.0      -37.0
## 160725      UA       -7.0      -13.0
## 160741      AA      -13.0      -38.0
eng_lang_setup_ex_files/py1.pngのグラフ

eng_lang_setup_ex_files/py1.pngのグラフ

sager : sage -R

  • {lang ,ext=“sager”}
x <- 1:5
x
length(x)
str(x)
## /home/inoue/bin/go tmp_lang/chunk-23.sager  > tmp_lang/chunk-23.out 2>&1
## Compile & Execute : /var/www/html/LANG/tmp_lang/chunk-23.sager 
## > x <- 1:5
## > x
## [1] 1 2 3 4 5
## > length(x)
## [1] 5
## > str(x)
##  int [1:5] 1 2 3 4 5
## >

付録

eng_lang_setup.R のソース

  • {bash, comment=“”}
cat eng_lang_setup.R
# 言語エンジンeng_langの環境設定
#' A lang engine for knitr
#' @param options knitr options
#' @export
#' @examples \dontrun{
#' ## Add this to your document
#' library(knitr)
#' knit_engines$set(lang = eng_lang)
#' opts_chunk$set("engine" = "lang")
#' opts_chunk$set("echo" = FALSE)
#' }
### define functions : strsplit_vec, vec2str, gsub_rep
strsplit_vec <- function(x,sep,fixed=TRUE,debug=TRUE){
     # example : strsplit_vec("ex1.f",".") -> c("ex1", "f")
     out <- unlist(strsplit(x,sep,fixed=TRUE))
     cat("** strsplit_vec : ");str(out);#cat("\n")
     out
     }
vec2str <- function(vec,cutsep=", ",debug=TRUE){
     # example : vec2str(c("a","b","c")) -> "abc" 
     out <- toString(vec)
     out <- gsub(cutsep,"",out)
     if (debug) {cat("** vec2str :"); str(out)}
     out
     }
gsub_rep <- function(exp, strlist, debug=TRUE){ 
     # example : gsub_rep(ext, list(c("ext=",""),c('"',''),c(" ",""))) # 連続置換
     if (debug) {cat("** gsub_rep : inputed exp = "); str(exp)} 
     for (i in seq(along=strlist)){
        from <- strlist[[i]][1]
        to <- strlist[[i]][2]
        exp <- gsub(from, to, exp)
        }
     if (debug) {cat("** gsub_rep : "); str(exp)}
     exp
     }
#=== eng_lang ============================================================
# {lang ラベル, ext="f", stdin="./tmp_lang/data.in", eval=TRUE, echo=TRUE, ...}
# {lang , ext="mx", eval=TRUE, echo=TRUE, ...}
eng_lang <- function(options) {
  cat("*** ====== enter eng_lang ====== ***\n")
  debug <- FALSE
  engine <- options$engine
  eval <- options$eval 
    params.src <- options$params.src # 単なる文字列
  cmd <- if(is.null(options$engine.path)) engine else options$engine.path
  if (debug && (chunk_no==0) ) {cat("str(options)=\n"); print(str(options))}
  if (eval) {
    chunk_no <<- chunk_no + 1
    #if (options$echo == FALSE) options$echo <- TRUE  # 重要 #
    cat("*** cmd = ");print(cmd)
    cat("*** engine = ",options$engine, "\n")
    cat("*** options$label = ",options$label, "\n")
    cat("*** options$params.src = ",options$params.src,"\n") # 文字列
    # cat("+++ str(options$params.src) : ",str(options$params.src),"\n") #文字列
    if (debug) {cat("*** options$code = \n"); print(options$code); cat("\n")}
    # ext, stdin を抽出
    w1 <- strsplit_vec(options$params.src,",")
    ext <- grep("ext=",w1,value=TRUE)
    ext <- gsub_rep(ext, list(c("ext=",""),c('"',''),c(" ",""))) # 連続置換
    cat("** ext = ",ext,"\n") 
    stdin <- grep("stdin=",w1,value=TRUE)
    stdin <- gsub_rep(stdin, list(c("stdin=",""),c('"',''),c(" ",""))) # 連続置換
    cat("** stdin = ",stdin,"\n")
    if (length(stdin) > 0) stdin <- paste(" < ",stdin,sep="")
    cat("** stdin = ",stdin,"\n")
    # チャンクラベル options$label から sname, label を生成    
    sname <- options$label 
    sname <- gsub("unnamed-","",sname)
    label <- paste(sname,".",ext,sep="")
    cat("+++ label = ",label,", sname = ", sname, ", ext = ", ext,"\n")
    # 言語実行結果の出力ファイル名: ./tmp_lang/ラベル名.out 
    outfilename <- paste("tmp_lang/", sname, ".out", sep="")
    cat("+++ outfilename = ",outfilename,"\n")
    # 作業ディレクトリ/tmp/langの準備, ソースコードファイル scodefile の準備
    if (file.exists("tmp_lang") != TRUE) dir.create("tmp_lang")
    scodefile <- paste("tmp_lang/",label,sep="")
    cat("*** scodefile = ",scodefile,"\n")
    write(options$code,file=scodefile)  # code のファイルへの書き込み
    if (debug) file.show(scodefile, header="*** source code ***")
    # パイプを使って実行コマンド mycmd を生成
    mycmd <- paste("/home/inoue/bin/go ", scodefile, " ", stdin,
                   " > ", outfilename, " 2>&1",sep="")
    cat("*** mycmd = ",mycmd,"\n")
    system(mycmd) # コマンドの実行
    # 結果ファイルの取り込み
    out <- scan(outfilename,what="list",sep="\n") 
    out <- c(mycmd,out)
    } else { out <- "*** eval = FALSE ***"} # end of if-eval
  if (debug) file.show(outfilename,header="*** output ***")
  err <- grep("Error:",out)
  if (length(err)>0) {cat("---> Error in Chunk & Halt\n"); q() }
### skip end ###########################################################
#options(knitr.duplicate.label = 'allow') # チャンク名の重複を許す
knitr::engine_output(options, options$code, out)
}  # end of eng_lang
#=== main ==============================================================
library(knitr)                 # ライブラリ knitr の呼び出し
library(reticulate)            # ライブラリ reticulate の呼び出し
names(knit_engines$get())      # kinitr の エンジン名一覧の表示
names(opts_chunk$get())        # チャンクオプション一覧の表示
#options(knitr.duplicate.label = 'allow') # チャンク名の重複を許す
##### memo
if (0) {
  cat("bash---\n")
  knit_engines$get("bash")  # エンジン名fortranの処理関数の内容を表示
  cat("fortran---\n")
  knit_engines$get("fortran")  # エンジン名fortranの処理関数の内容を表示
  cat("perl---\n")
  knit_engines$get("perl")     # エンジン名perlの処理関数の内容を表示
  cat("python---\n")
  knit_engines$get("python")   # エンジン名pythonの処理関数の内容を表示
}
#--- main setup 
chunk_no <- 0                       # チャンク番号のリセット
chunk_name <- "chunk-"              # 無名チャンク名のときのチャンク名
unlink("tmp_lang/*")               # 作業ディレクトリ内のファイルの除去
knit_engines$set(lang = eng_lang)   # エンジン名langの処理を関数eng_langで指定
opts_chunk$set("engine" = "lang")   # エンジン名langをエンジンに追加する
#opts_chunk$set("echo" = TRUE)      # チャンクオプションの初期設定
names(knit_engines$get())           # エンジン一覧(langが追加されていることを確認)
#names(opts_chunk$get())
options(knitr.duplicate.label = 'allow') # チャンク名の重複を許す
cat("=== knitr, reticulate, eng_lang are go. ===\n")

シェルスクリプト ~/bin/go の内容

  • {bash, comment=“”}
cat ~/bin/go
#! /bin/sh
#========================================='94-02-17  by Takakatsu INOUE
#case $# in
#  0 )  echo "Usage: $0  [file-name|@]"; exit;; 
#esac
p2=$2; p3=$3; p4=$4; p5=$5; p6=$6
CMD="$0 $*"
case $1 in
  "" ) infile=`cat $HOME/.env/.now`
       set `fna $infile` > /dev/null
          fullname=$1; dir=$2; fname=$3; sname=$4; ext=$5        
       ;;
  * ) if test -f $1 ; then
          set `fna $1` > /dev/null 
          fullname=$1; dir=$2; fname=$3; sname=$4; ext=$5
          echo $fullname > $HOME/.env/.now
       else  
          echo "File $1 is not exsist" ; exit ;
       fi
       ;; 
esac
######################## TeX type (.tex | .Rnw) #######################
err=0
texdir="/usr/local/texlive/2017/bin/x86_64-linux/"
case $ext in
  "tex"|"Rnw")
     if test -f ${fullname}; then
        textype="platex -shell-escape -interaction=nonstopmode "
        grep '^\\documentclass\[uplatex' ${fullname}
        if [ $? -eq 0 ] ; then   # 0:found, 1:not found, 2:error
        textype="uplatex -shell-escape -interaction=nonstopmode "
        fi
        grep '^\\documentclass.*ltjarticle' ${fullname}
        if [ $? -eq 0 ] ; then   # 0:found, 1:not found, 2:error
        textype="lualatex -shell-escape -interaction=nonstopmode "
        fi
     fi
      ### papaertype ###
      papertype="a4"
      grep '^\\document.*a4' ${fullname} # 0:found, 1:not found, 2:error
          if [ $? -eq 0 ]; then papertype="a4";  fi
      grep '^\\document.*a5' ${fullname}
          if [ $? -eq 0 ]; then papertype="a5" ;  fi
      grep '^\\document.*b4' ${fullname}
          if [ $? -eq 0 ]; then papertype="b4" ;  fi
      grep '^\\document.*b5' ${fullname}
          if [ $? -eq 0 ]; then papertype="b5" ;  fi
      grep 'hagaki' ${fullname}
          if [ $? -eq 0 ]; then papertype="a6";   fi
      ### dvi2type ###
      dvi2type="${texdir}dvips"  # psfrag機能使用の場合
      grep '^\\usepackage.*dvipdfmx' ${fullname}
         if [ $? -eq 0 ]; then dvi2type="${texdir}dvipdfmx"; fi  
      grep '^\\documentclass.*ltjarticle' ${fullname}
        if [ $? -eq 0 ] ; then  dvi2type="echo"; fi
    ;;
esac
################################################
#echo "CMD : $CMD "
#echo "$0 $*"
echo "Compile & Execute : $fullname "
err=0
#echo "fullnmae= $fullname dir=$dir fname=$fname sname=$sname ext=$ext"
#      /home/inoue/a.tex -> dir:/home/inoue, fname:a.tex, sname:a, ext:tex 
case $ext in
   c   ) echo "Compile & Execute: gcc -std=c90 $fullname -lm -o $dir/$sname; $dir/$sname";
         gcc -std=c90 $fullname -lm -o $dir/$sname; $dir/$sname ;;
   html) firefox -new-window $fullname  ;;
   tex ) echo "--- textype : ${textype}"
      echo "--- papertype : ${papertype}"
      echo "--- dvi2type : ${dvi2type}"
      case ${dvi2type} in
#        *"dvipdfmx"*) papertype="-p ${papertype}";;
        *"dvipdfmx"*) papertype="";;
        *"dvips"*) papertype="-t ${papertype}";;
      esac
      set -x
      ${textype} ${dir}/${sname}.tex > /tmp/tmp-tex.log 2>&1; 
      ${dvi2type} ${papertype} ${dir}/${sname}.dvi > /tmp/tmp-dvi.log 2>&1 ;
      set +x 
      case ${dvi2type} in
        *"dvips") echo "${texdir}ps2pdf ${dir}/${sname}.ps"
            ${texdir}ps2pdf ${dir}/${sname}.ps > /tmp/tmp-ps2pdf.log 2>&1 ;;
        "echo") echo "tex -> pdf type";;
        *       ) exit;;
      esac
      echo "textype : $textype";
      echo "---> evince ${dir}/${sname}.pdf" ;;
   sh    ) sh $fullname ;;
   bash  ) bash $fullname ;;
   csh   ) csh $fullname ;;
   p|pas ) echo "Complie & Execute: fpc -Tlinux  $fullname ; $dir/$sname";
           fpc -Tlinux    $fullname ; $dir/$sname ;;
   perl  ) perl $fullname;;
   m     ) math    $fullname  < $sname;;
   mx    ) maxima --very-quiet -b $fullname ;;
#   mx    ) maxima -b $fullname ;;
   wxm   ) maxima --very-quiet -b $fullname ;; 
   py    ) python $fullname ;;
   py3   ) python3 $fullname ;;
   sage  ) sage  $fullname ;;
   sagem ) cat $fullname | sage -maxima [--very-quit] ;;
   sager ) cat $fullname | sage -R --no-init-file --vanilla --silent ;;
   sagep ) cat $fullname | sage -python ;; 
   dmk   ) cd ${dir};  dmk $fname tex a4 ;;
   Rmd   ) cd ${dir}; rmd $fname $p2 $p3 $p4 ;;
   md    ) cd ${dir}; rmd $fname $p2 $p3 $p4 ;;
   r|R   ) R --no-init-file --vanilla --silent  < $fullname;;
#   f     ) gfortran $fullname -o $sname; $dir/$sname ;;
   f   ) cd ${dir};
         echo "Compile: gfortran ${fname} -o ${sname} > ${sname}.log 2>&1 || err=1"; 
         gfortran ${fname} -o ${sname} > ${sname}.log 2>&1 || err=1; 
         case $err in 
           1) cat ${sname}.log; exit ;;
         esac
         echo "Execute: ./${sname} $p2 $p3 $p4 $p5 $p6 ";
         ./${sname} $p2 $p3 $p4 $p5 $p6 ;;
   in|data) echo "Input Data File: $fullname ";
         cat $fullname ;;
   dvi   ) ${texdir}xdvi -geometry -0+0   $fullname ;;
   Rnw ) echo "=== Rnw case ==="
         echo "--- papertype : ${papertype}"
         echo "--- dvi2type : ${dvi2type}"
         echo "Run : /home/inoue/bin/R-Sweave ${fullname}"
         RNW="${dir}/RNW"; mkdir ${RNW} > /dev/null 2>&1 || rm ${RNW}/* ; 
         cp ${fname} ${RNW}/;  cd ${RNW};  # change working dir
         /home/inoue/bin/R-Sweave ${fname} > /tmp/tmp-R.log 2>&1 || err=1;
         case $err in
           1) echo "---> Error in R-Sweave";  cat /tmp/tmp-R.log;  exit 1;;
         esac;
         cp ${RNW}/${sname}.tex /tmp/tmp-tex.wrk ;
         case ${dvi2type} in 
           *"dvipdfmx") 
             sed 's/\(-[0-9][0-9][0-9]\)}/\1.pdf}/' /tmp/tmp-tex.wrk > ${RNW}/${sname}.tex ;;
         esac
         echo "Run : $textype ${RNW}/${sname}.tex";
         ${textype} ${RNW}/${sname}.tex > /tmp/tmp-Tex.log 2>&1 || err=2; 
         case $err in
           2) echo "---> Error/Waring in Tex compile";
              grep 'Output written on' /tmp/tmp-Tex.log || err=3;
              case $err in 
                3) cat /tmp/tmp-Tex.log ; exit 3;;
              esac;;
         esac;
         ### dvi to {ps|pdf}
         set +x
         case $dvi2type in
           *"dvipdf"* )
#              echo "Run : dvipdfmx -p ${papertype} ${RNW}/${sname}.dvi";
#              dvipdfmx -p ${papertype} ${RNW}/${sname}.dvi > /tmp/tmp-Dvipdf.log 2>&1 
              echo "Run : dvipdfmx ${RNW}/${sname}.dvi";
              dvipdfmx ${RNW}/${sname}.dvi > /tmp/tmp-Dvipdf.log 2>&1 ;;
           *"dvips"*) 
              echo "Run : /usr/bin/dvips -t ${papertype} ${RNW}/${sname}.dvi"
              /usr/bin/dvips -t ${papertype} ${RNW}/${sname}.dvi > /tmp/tmp-dvi.log 2>&1 
              echo "Run : /usr/bin/ps2pdf ${RNW}/${sname}.ps"
              /usr/bin/ps2pdf ${RNW}/${sname}.ps > /tmp/tmp-ps2pdf.log 2>&1 ;;
           *     ) exit;;
         esac
         echo "Run : cp ${RNW}/${sname}.pdf ${dir}/"
         cp ${RNW}/${sname}.pdf ${dir}/ 
         echo "---> evince ${dir}/${sname}.pdf"  ;;
   *   ) echo "go : Not support compiler" ;;
esac

シェルスクリプト ~/bin/rmd の内容(~/bin/go 内で使用される)

  • {bash, comment=“”}
cat ~/bin/rmd
#!/bin/bash
#========================================='18-03-26  by Takakatsu INOUE
case $# in
  0 )  echo "
   === Usage: $0 rmdfile  ===
   ex. $0 ex1.Rmd 
       $0 ex1.Rmd html_document
       $0 ex1.Rmd ioslides_presentation
       $0 ex1.Rmd all  <--- YAML のすべてのoutput_formatを出力する
 
   Rscript -e \"rmarkdown::rendar('ex1.Rmd'); browseURL('ex1.html')\"
     --->  ex1.Rmd を rmardown で処理し結果を ex.html に返す
        注: \${f%.jpg} はファイル名から .jpg を除いた部分を返す.(Bashのブレース展開)
            \${f%.*} はファイル名から任意の拡張子を除いた部分を返す.
    input: ??.Rmd ??.md ??.R
    output_format: 'all' 'html_document' 'pdf_document' 'beamer_presentation'
                   'ioslides_presentaion' 'md_document' 'word_document'
      ex.  html_document
           html_document(toc=TRUE,thema=journal)  <--- YALMと競合する
            "
   exit
   ;;
esac

p2=$2
p3=$3
case $1 in
  "" ) infile=`cat $HOME/.env/.now`
       set `fna $infile` > /dev/null
          fullname=$1; dir=$2; fname=$3; sname=$4; ext=$5        
       ;;
  * ) if test -f $1 ; then
          set `fna $1` > /dev/null 
          fullname=$1; dir=$2; fname=$3; sname=$4; ext=$5
          echo $fullname > $HOME/.env/.now
       else  
          echo "File $1 is not exsist" ; exit ;
       fi
       ;; 
esac

case ${ext} in
   "Rmd"|"md"|"R") infile=${fullname};;
   *) echo "---> ${ext} is Not {Rmd, md, R} and No Compile "; exit;;
esac

#infile=$1;  
outform=",'html_document'"; 
htmlfile="${infile%.*}.html"; 
bURL="; browseURL('${htmlfile})')"
viewcmd="firefox -new-window ${htmlfile}"

case $p2 in 
    "html"*) outform=",'html_document'"; 
             viewcmd="firefox -new-window ${htmlfile}" ;;
    "pdf"*)  outform=",'pdf_document'";  
             viewcmd="evince ${infile%.*}.pdf" ;;
    "bea"*)  outform=",'beamer_presentation'"; 
             viewcmd="evince ${infile%.*}.pdf" ;;
    "ios"*)  outform=",'ioslides_presentation'";
             viewcmd="firefox -new-window ${infile%.*}.html" ;;
    "md"*)   outform=",'md_document'";
             viewcmd="less ${infile%.*}.md" ;;
    "word"*|"doc"*) outform=",'word_document'";
             viewcmd="lowriter ${infile%.*}.docx" ;;
    "all")   outform=",'all'";;
    ""   )   outform=",'html_document'"; 
             viewcmd="firefox -new-window ${htmlfile}" ;;
esac

case $p3 in
     "noview") viewcmd="echo 'noview'"::
esac

echo "---infile=${infile} "
echo "---outform=${outform}"
echo "---hmlfile=${htmlfile}"
echo "---viewcmd=${viewcmd}"

echo "Rscript -e \"rmarkdown::render('${infile}' ${outform})\""
err=0
Rscript -e "rmarkdown::render('${infile}' ${outform})" 2>&1 || err=1
case $err in 
  1) echo "** Error in rmarkdown and Halt ***"; exit;;
esac

#Rscript /home/inoue/Python/lang_err.r
#Rscript /home/inoue/bin/lang_err.r
Rscript ./eng_lang_err.R

if test -f ./tmp_lang/err;  then
   echo "== ~/bin/go -> ~/bin/rmd -> Rscript ~/bin/eng_lang_err.R : 判定:存在する ==" 
   exit 
fi
     
${viewcmd}
echo "Done Viewer by ${viewcmd}"
echo "Done: Rscript -e \"rmarkdown::render('${infile}' ${outform})\""

eng_lang_setup_ex.Rmd の内容

  • {bash, comment=“”}
cat eng_lang_setup_ex.Rmd 
---
title: "eng_lang_setup_ex.Rmd <br>: 計算機言語の実行記録の収集"
author: "INOUE Takakatsu  更新:`r Sys.Date()`"
output: 
  html_document:
    keep_md: no
    self_contained: no
    toc: yes
    toc_depth: 3
    # theme: null
    highlight: null
    md_extensions: -ascii_identifiers
    # lib_dir: TMPDIR
    css: mystyle.css
    includes:
    #    after_body: include_lightbox2.html
  ioslides_presentation:
    toc: yes
  pdf_document:
    latex_engine: lualatex
    keep_tex: yes
    toc: yes
  word_document:
    toc: yes
documentclass: ltjarticle
---
# 言語エンジンeng_langの環境設定  
Rプログラム eng_lang_setup.R は knit の紹介サイト [https://yihui.org/knitr/](https://yihui.org/knitr/) の engine.R を参考にして作成した.  

* {r, setup}  
```{r, setup}
source("eng_lang_setup.R")
```


# 標準エンジンの使用例

### Rの実行
* {r, engine="R"}  
```{r, engine="R"}
x <- 1:5
x
str(x)
```

### perlの実行  
* {perl}  
```{perl}
$test = "jellow world";
$test =~ s/j/h/;
print $test
```
### Maximaの実行  
* {bash}  
```{bash} 
echo  '
(linel:70)$                  /* 行長を指定(コメント例) */
exp1 : (x+y)^2;              /* 式の定義 */
exp2 : expand(exp1);         /* 式exp1を展開 */
(display2d:false)$           /* 表示形式の変更 */
factor(exp2);                /* 式exp2を因数分解 */
solve(x^2-2*x-1=0,x);        /* 2次方程式の求解 */
solve([a*x+b*y=e,c*x+d*y=f],[x,y]);  /* 連立方程式の求解 */
/* 作図例 */
plot2d([sin(x),cos(x)],[x,-2*%pi,2*%pi],
       [gnuplot_term,png],[gnuplot_out_file,"eng_lang_setup_ex_files/fig-m1.png"]);
' > tmp_lang/tmp.mx
maxima -b tmp_lang/tmp.mx
```
<div align="center">
<img width="400" alt="写真" src="eng_lang_setup_ex_files/fig-m1.png"><br>
図1. eng_lang_setup_ex_files/fig-m1.png
</div>

## 標準エンジンを用いたpythonとRの連携
* {python}
```{python}
a = 7
print(a)
```
* {r, engine="R"}
```{r, engine="R"}
py$a
```

# 追加エンジン lang を使用 

**チャンクの記法**
```
  {lang ラベル, ext="f", stdin="tmp_lang/data.in", eval=TRUE, echo=TRUE, ...}
```
作業ディレクトリ tmp_lang/ において,ファイル **ラベル.f**(ファイル拡張子は**ext**で指定する) を作成し, FORTRANソースコードとして
コンパイル&実行 を行う. 実行時に,入力要求されるデータは **stdin** で指定されたファイルから読み込まれる. つづく引数 eval=TRUE, echo=TRUE, ... は**RMarkDown**で用意されている引数である.   
拡張子ext に指定できる計算機言語としては以下が用意されている.
```
bash -> bash,  c -> c,       f -> FORTRAN,  f95 -> FORTRAN95,  mx|mac -> Maxima
pas -> Pascal, perl -> Perl, py -> Python,  py3 -> Python3,    
r|R -> R,      sh -> sh,     in|data -> データ入力
sage -> sage,  sagem -> sage -maxima, sagep -> sage -python, sager -> sage -R  
```
**ext**は省略不可の引数である.
ラベルは省略するとknitrによってunnamed-chunk-??といったチャンク名が割り振られるが,作業ディレクトリ内ではunnamed-は省略したファイルを生成する. 引数**stdin**は不用な場合は省略できる.
ラベルを省略するときは
```
  {lang , ext="f", eval=TRUE, echo=TRUE, comment="##", ...}  # lang の後のカンマを忘れないこと
```
とする.

## pythonとRの連携 (lang エンジンを使用して)
* {lang , ext="py"}
```{lang , ext="py"}
a = 7
print(a)
```
* {lang, ext="r"}  **機能せず(open problem!!)**
```{lang, ext="r"}
py$a
```
* {r, engine="R"}  **機能する**
```{r, engine="R"}
py$a
```
追加されたエンジン lang では "pythonとRの連携"は機能しない.しかしながら幸いにして lang を追加しても標準エンジン {r, engine="R"} が使用できるので一応はセーフとする.  

## bash
* {lang , ext="bash"}
```{lang , ext="bash"}
date
ls *.csv
```

## Perl
* {lang, ext="perl"}
```{lang, ext="perl"}
$test = "jellow world";
$test =~ s/j/h/;
print $test
```

## Python (データファイル flights.csv を使用する)
* {lang ,ext="py", eval=TRUE, echo=TRUE}
```{lang ,ext="py", eval=TRUE, echo=TRUE}
import pandas
flights = pandas.read_csv("flights.csv")
flights = flights[flights['dest'] == "ORD"]
flights = flights[['carrier', 'dep_delay', 'arr_delay']]
flights = flights.dropna()
print flights.head(3)
print flights.tail(3)
flights
```
* {lang ,ext="py3", eval=TRUE, echo=TRUE}
```{lang ,ext="py3", eval=TRUE, echo=TRUE}
# python3
# coding: utf-8
for j in range(1,8):
   print('ひつじが'+str(j)+'匹')
```

## Fortran
* データ {lang tmp, ext="in", eval=TRUE, echo=TRUE} 
 
```{lang tmp, ext="in", eval=TRUE, echo=TRUE}
5
11 12 13 14 15
```
* プログラム {lang ,ext="f", stdin="tmp_lang/tmp.in" , echo=TRUE}  
```{lang ,ext="f", stdin="tmp_lang/tmp.in" , echo=TRUE}
c------program stat1f : av and sd
      program stat1f
      parameter (nmax=100)
      dimension x(nmax)
      write(6,*)"?-<n : # of data> ="
c     ファイルの読み込み(status="old"),書き込み(status="replace")
c      open(5,file="/tmp/lang/tmp.in",status="old",err=999)
      read(5,*) n
      if (n > nmax) then 
         write(6,*)"Error: n > nmax"
         stop
         end if
      write(6,*)"?-<data: x(i),i=1,n> ="
      read(5,*)(x(i),i=1,n)
        write(6,*)"n =",n
        write(6,*)"{x(i),i=1,n}",(x(i),i=1,n)
      sum = 0.0
      do 100 i=1,n
          sum = sum + x(i)
  100 continue
      av = sum/n
      sum = 0.0
      do 200 i=1,n
         sum = sum + (x(i)-av)**2
  200 continue
      var = sum/n; sd = sqrt(var)
      write(6,*)" av = ",av,
     1 " , var = ", var, " , sd = ",sd
      stop
  999 write(6,*)"Error in file-open"
      end
```
## Pascalの実行例  
* {lang , ext="pas", stdin="tmp_lang/tmp.in", echo=TRUE}
```{lang , ext="pas", stdin="tmp_lang/tmp.in", echo=TRUE}
{======================================================
stat1p : av, var, sd
======================================================}
program stat1p;
   const nmax=100; pmax=10;
   type vecr = array[1..nmax] of real;
   var i,n : integer;
       sum, av, var0, sd : real;
       x : vecr;
begin { of stat1p}
  writeln('run : stat1p.pas');
  write('?-<n : # of data> = '); readln(n);
  writeln('?-<x[i], i=1,n> ='); 
  for i:=1 to n do read(x[i]);
  sum := 0.0;
  for i:=1 to n do begin
      sum := sum + x[i];
  end;
  av := sum/n;
  sum := 0.0;
  for i:=1 to n do begin
    sum := sum + (x[i]-av)*(x[i]-av);
  end;
  var0 := sum/n;
  sd := sqrt(var0);
  writeln('n =',n:4,' ,av = ',av:8:3, ' , var0 = ',var0:8:3, ' , sd = ',sd:8:3);
end. {of stat1p}
```
## Cの実行例  
* {lang , ext="c", stdin="tmp_lang/tmp.in", echo=TRUE}  
```{lang , ext="c", stdin="tmp_lang/tmp.in", echo=TRUE}
/* stat1c : av & sd for one dimension       1994-08-02   by T.INOUE */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NMAX 100
int main()
{
  int i, n;
  float av, var, sd, x[NMAX+1];
  printf(" ?-<n : # of data> = "); scanf("%d",&n);
  if (n > NMAX) exit(1);
  printf(" ?-<x[i], i=1,n> =");
  for (i=1; i<=n; ++i)
    { scanf("%f",&x[i]);}
  av = 0.0;
  for (i=1; i<=n; ++i) {av = av + x[i];} av = av / n;
  var = 0.0;
  for (i=1; i<=n; ++i) {var = var + (x[i]-av)*(x[i]-av);} var = var / n;
  sd = sqrt(var); 
  printf("\n AV. = %f   Var. = %f  S.D. = %f \n", av, var, sd);
}
``` 
## Rの実行例
* {lang ,ext="r"}の場合
```{lang , ext="r"}
x <- c(11,12,13,14,15)   # データ
mean(x)                  # 平均
var(x)                   # 分散(不偏分散)
n <- length(x); var0 <- var(x)*(n-1)/n; var0
sd(x)                    # 標準偏差
sd0 <- sqrt(var0); sd0
png("eng_lang_setup_ex_files/fig1.png")
hist(x)                  # 作図は自動生成されない(前後の2行で手動指定する)
dev.off()
```
![eng_lang_setup_ex_files/fig1.pngのグラフ](eng_lang_setup_ex_files/fig1.png)

* {r ,engine="R"}の場合
```{r , engine="R"}
x <- c(11,12,13,14,15)   # データ
mean(x)                  # 平均
var(x)                   # 分散(不偏分散)
n <- length(x); var0 <- var(x)*(n-1)/n; var0
sd(x)                    # 標準偏差
sd0 <- sqrt(var0); sd0
hist(x)                  # 作図は自動生成される
```
 
## Maximaの実行例1  
* {lang ,ext="mx" }
```{lang ,ext="mx" }
(linel:70)$                  /* 行長を指定(コメント例) */
exp1 : (x+y)^2;              /* 式の定義 */
exp2 : expand(exp1);         /* 式exp1を展開 */
(display2d:false)$           /* 表示形式の変更 */
factor(exp2);                /* 式exp2を因数分解 */
solve(x^2-2*x-1=0,x);        /* 2次方程式の求解 */
solve([a*x+b*y=e,c*x+d*y=f],[x,y]);  /* 連立方程式の求解 */
/* 作図例 */
plot2d([sin(x),cos(x)],[x,-2*%pi,2*%pi],
       [gnuplot_term,png],[gnuplot_out_file,"eng_lang_setup_ex_files/fig2.png"]);
```

<div align="center">
<img width="400" alt="写真" src="eng_lang_setup_ex_files/fig2.png"><br>
図2. fig2.png
</div>

## Maximaの実行例2  
* {lang, ext="mx"}
```{lang, ext="mx"}
(load(draw), display2d:false, linel:70)$
f : expand((x-1)*(x-3)*(x-6))$
for i:1 thru 3 do ( define(t[i](x,x0), taylor(f,x,x0,i)) );
g1 : gr2d(xrange = [0,6.5], yrange = [-10, 10], grid=true,  
          font="Arial", font_size=24,
          title="x0 = 2",
          color=red, key="f(x)", explicit(f, x, 0, 6.5),
          color=blue,key="f1(x)",explicit(t[1](x,2), x, 0, 6.5),
          color=green,key="f2(x)",explicit(t[2](x,2),x,0,6.5)  )$
g2 : gr2d(xrange = [0,6.5], yrange = [-10, 10], grid=true,
          title="x0=3",  
          color=red, key="f(x)", explicit(f, x, 0, 6.5),
          color=blue,key="f1(x)",explicit(t[1](x,3), x, 0, 6.5),
          color=green,key="f2(x)",explicit(t[2](x,3),x,0,6.5)  )$
draw(terminal=png, file_name="eng_lang_setup_ex_files/fig3",columns=2, 
     dimensions=[1000,400], g1,g2)$
``` 
<div align="center">
<img width="800" alt="写真" src="eng_lang_setup_ex_files/fig3.png">
<br>図3. fig3.png
</div>



## sageの実行例1
* {lang , ext="sage"}
```{lang , ext="sage"}
a = factor(2014)
print a
pi
print n(pi)
print n(pi,digits=30)
print (1+2*I)^2
fig1 = plot(sin(x),(x,-pi,pi))
#show(fig1)
fig1.save('eng_lang_setup_ex_files/fig-s1.png')
```
![eng_lang_setup_ex_files/fig-s1.pngのグラフ](eng_lang_setup_ex_files/fig-s1.png){width="50%"}

## sagem : sage -maxima
* {lang , ext="sagem"}
```{lang , ext="sagem"}
exp : (x+y)^3;
expand(exp);
taylor(sin(x),x,0,7);
```
## sagep : sage -python (データファイル flights.csv を使用する)  
* {lang , ext="sagep"}
```{lang , ext="sagep"}
import pandas
flights = pandas.read_csv("flights.csv")
flights = flights[flights['dest'] == "ORD"]
flights = flights[['carrier', 'dep_delay', 'arr_delay']]
flights = flights.dropna()
print flights.head(3)
print flights.tail(3)
flights
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.cos(2*np.pi*t)
#print t.head(3)
#print s.head(3)
plt.plot(t, s)
plt.xlabel('times (s)')
plt.ylabel('voltage (mV)')
plt.grid(True)
plt.savefig("eng_lang_setup_ex_files/py1.png")
#plt.show()
```
![eng_lang_setup_ex_files/py1.pngのグラフ](eng_lang_setup_ex_files/py1.png){width="50%"}

## sager : sage -R  
* {lang ,ext="sager"}
```{lang ,ext="sager"}
x <- 1:5
x
length(x)
str(x)
```

# 付録
### eng_lang_setup.R のソース  
* {bash, comment=""}  
```{bash, comment=""}
cat eng_lang_setup.R
```
### シェルスクリプト ~/bin/go の内容  
* {bash, comment=""}  
```{bash, comment=""}
cat ~/bin/go
```
### シェルスクリプト ~/bin/rmd の内容(~/bin/go 内で使用される)  
* {bash, comment=""}  
```{bash, comment=""}
cat ~/bin/rmd
```
### eng_lang_setup_ex.Rmd の内容  
* {bash, comment=""}  
```{bash, comment=""}
cat eng_lang_setup_ex.Rmd 
```
### eng_lang_setup_ex.Rmd を処理して eng_lang_setup_ex.html を作成する.  
```
$ ~/bin/go eng_lang_setup_ex.Rmd
```
  
  

eng_lang_setup_ex.Rmd を処理して eng_lang_setup_ex.html を作成する.

$ ~/bin/go eng_lang_setup_ex.Rmd