【SQL Server】基本統計量の算出(特に中央値!percentile_cont関数、percentile_disc関数)

タイトル通り、基本統計量の算出方法です。
SQL Serverには、中央値を算出するmedian()はありません ...

(同じMicrosoftExcelにはあるのに ...)
SASのproc sqlではmedian()が使えるのに ...)
とがっかりしましたが、どうやらpercentile_cont()を用いることで対応できるようです。

 

ということで、サンプルデータを準備します。
PlaceboのAVALは{1,2,3,4}なのでmedian=2.5、XXX-001は{1,2,8,9}なのでmedian=5になる想定です。

if object_id(N'tempdb..#tmp1', N'U') is not null drop table #tmp1;
create table #tmp1(
   USUBJID varchar(10) not null
  ,TRT01P  varchar(10) not null
  ,AVAL int null
  ,constraint PK_tmp1 primary key(USUBJID)
);
insert into #tmp1(USUBJID, TRT01P, AVAL)
values 
   ('ID101','Placebo',2)
  ,('ID102','Placebo',1)
  ,('ID103','Placebo',3)
  ,('ID104','Placebo',4)
  ,('ID105','XXX-001',9)
  ,('ID106','XXX-001',7)
  ,('ID107','XXX-001',8)
  ,('ID108','XXX-001',1)
;

 

このデータに対して基本統計量を算出します。

select
   TRT01P
  ,count(*)  as 件数
  ,max(AVAL) as 最大値
  ,min(AVAL) as 最小値
  ,avg(AVAL) as 平均値
  ,max(第一四分位) as Q1
  ,max(第二四分位) as Q2_中央値
  ,max(第三四分位) as Q3
  ,round(var(AVAL),1)    as 標本分散
  ,round(varp(AVAL),1)   as 母分散
  ,round(stdev(AVAL),1)  as 標本標準偏差
  ,round(stdevp(AVAL),1) as 母標準偏差
from (
      select
        *
        ,percentile_cont(0.25) within group (order by AVAL) over (partition by TRT01P) as 第一四分位
        ,percentile_cont(0.50) within group (order by AVAL) over (partition by TRT01P) as 第二四分位
        ,percentile_cont(0.75) within group (order by AVAL) over (partition by TRT01P) as 第三四分位
      from #tmp1
    ) as tmp
group by TRT01P

 

結果はこちら

TRT01P   件数  最大値  最小値  平均値  Q1    Q2_中央値  Q3    標本分散  母分散  標本標準偏差標準偏差
-------- ----- ------- ------- ------- ----- ---------- ----- --------- ------- ------------- -----------
Placebo  4     4       1       2       1.75  2.5        3.25  1.7       1.3     1.3           1.1
XXX-001  4     9       1       5       1.75  5          8.25  16.7      12.5    4.1           3.5
(2 行処理されました)

 

うまく算出できました。
中央値の部分を抜き出すと次の通りで、
TRT01P毎にAVALの50パーセントタイル値を算出する指定です。

 percentile_cont(0.5) within group (order by AVAL) over (partition by TRT01P)

percentaile_cnt()を0.25、0.75にすれば、それぞれ第一四分位と第三四分位も算出できます。

なお、max()などと一緒にgroup byで処理できなかったため、
先にサブクエリで中央値を算出してから、max()で1行に集約する方法をとっています。

 

ちなみに、もう一方のpercentile_disc()は指定したパーセンタイル値に近い最小値を返す関数のようです。
例えば、集合{1,2,3,4}の時は中央値=2.5がないため、近い値{2,3}のうち最小値の2が返ってきます。集合{1,2,90,100}の時も同じ要領で2が返ってきます(真の中央値とだいぶズレますね)。
集合{1,2,30,400,500}で中央値=30がある場合は、30が返ってきます。

 

本記事はここまでです。

 


documentationはこちら。

docs.microsoft.com

docs.microsoft.com

【R言語】プログラムファイル用のテンプレート(結構使える!)

Rに限らず、プログラムファイルを見ると、いきなりコードを書き始める人もいますが、私は環境設定・データ取得・加工・出力はなるべくまとまりにすべきだと思っています。(そのほうがメンテナンス性が良いと思います。)

ということで、R用テンプレートのメモです。

 

こちらの方法では最初にコンソール、グラフ、グローバルワークスペースをきれいにしています。また、作業ディレクトリを以下の流れで設定しています。

  • バッチ実行でなければ(引数として指定パスを受け取っていなければ)、rstudioapi::getSourceEditorContext()$path にて現在開いているRスクリプトファイルのパスを設定する。
  • バッチ実行なら(引数として指定パスを受け取っているなら)、引数の値を設定する。

 バッチ実行の方法は以下の記事をご覧ください。
【R言語&Javascript】Rスクリプトをバッチ実行する(その1) - こちにぃるの日記(今日もお疲れ様です)
【R言語&Javascript】Rスクリプトをバッチ実行する(その2) - こちにぃるの日記(今日もお疲れ様です)


なお、getSourceEditorContext関数は、RStudioのAPIのため、RStudioのインストールが必要です(RStudioでコードを書くことを前提にしてます)。
Rスクリプトファイルのパスを簡単に取得できるため採用しています。

 

【テンプレートの例】

#===============================================================================
# タイトル :
# 作 成 者 :
# 備    考 :
#===============================================================================
#-------------------------------------------------------------------------------
# 環境設定
#-------------------------------------------------------------------------------
###--- Console クリア
cat("\014")

###--- Plots クリア
if( dev.cur() > 1 ) dev.off()

###--- Global workspace クリア
rm( list = ls( envir = globalenv() ), envir = globalenv() )

###--- Set dir
args <- commandArgs(trailingOnly=TRUE)[1]
if (is.na(args)==TRUE) {
  myPath <- dirname(rstudioapi::getSourceEditorContext()$path)
} else {
  myPath <- args
}
setwd(myPath)
getwd()

###--- library
library(tidyverse)

#-------------------------------------------------------------------------------
# データ取得
#-------------------------------------------------------------------------------

#-------------------------------------------------------------------------------
# 実行
#-------------------------------------------------------------------------------

#-------------------------------------------------------------------------------
# End of File
#-------------------------------------------------------------------------------

以上です。

 


getSourceEditorContext関数のDocumentationはこちら。www.rdocumentation.org

【R言語&Javascript】Rスクリプトをバッチ実行する(その2)

Rscript.exeを使ったバッチ実行ツールの記事の続きです。

Rscript.exeで設定した引数の受け取り方法を解説します。
引数の設定は、次のとおりでした。

Rscript.exe [Rスクリプトのファイルパス] [引数1]

この[引数1]をどう受け取るか。
先に方法を掲載しますが、commandArgs関数を使います。

commandArgs(trailingOnly=TRUE)[1]

末尾の[1]が[引数1]の指定にあたります。[2]とすれば[引数2]です。簡単ですね。
なお、trailingOnly=TRUEをつけておかないと引数以外の情報も持ってきてしまうようなので、TRUEにします。デフォルトはFALSEです。

 

ということで、検証のため、以下のサンプルコードを用意しました。
ggplot2で作図~出力し、その後、printでエラーを発生させています。
バッチ実行時に正常にグラフを出力できるか、エラーがログに出力されるかを検証します。

#===============================================================================
# バッチ実行用のテストファイル
#===============================================================================
#-------------------------------------------------------------------------------
# 環境設定
#-------------------------------------------------------------------------------
###--- Set dir
args <- commandArgs(trailingOnly=TRUE)[1] #-- 引数1を受け取る
if (is.na(args)==TRUE) {
  myPath <- dirname(rstudioapi::getSourceEditorContext()$path) #-- 引数1がNAなら本スクリプトがあるフォルダパスを取得(バッチ実行ではないと判断)。
} else {
  myPath <- args #-- 引数1がNAでなければ引数1で指定したパスを格納。
}
setwd(myPath)
getwd()

###--- library
library(tidyverse)

#-------------------------------------------------------------------------------
# 実行
#-------------------------------------------------------------------------------
###--- サンプルデータ作成
ads <- data.frame(x1=seq(1:10),y1=seq(1:10))

###--- グラフ作成
g1  <- ggplot(ads, mapping=aes(x=x1, y=y1)) + geom_point()

ggsave(filename = "fig_test_バッチ実行用.png", g1)

print(a)

#-------------------------------------------------------------------------------
# End of File
#-------------------------------------------------------------------------------

検証結果は以下です。
正常にグラフが出力され、エラーがログに記載されています。
バッチファイル、問題なく使えそうですね。

【グラフ出力】

f:id:cochineal19:20201123105046p:plain

バッチ実行後の出力イメージ(例)

【ログ出力】

-----------------------------------------------------------------------------------  
 対象ファイル:C:/Users/XXXX/R/test/test_バッチ実行用.r  
 実行日時  :2020年11月21日 22時41分16秒  
-----------------------------------------------------------------------------------  
[1] "C:/Users/XXXX/R/test"
-- Attaching packages --------------------------------------- tidyverse 1.3.0 --
√ ggplot2 3.3.2     √ purrr   0.3.4
√ tibble  3.0.1     √ dplyr   1.0.0
√ tidyr   1.1.0     √ stringr 1.4.0
√ readr   1.3.1     √ forcats 0.5.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
Saving 7 x 7 in image
 print(a) でエラー:  オブジェクト 'a' がありません 
 実行が停止されました 
--  
-----------------------------------------------------------------------------------  
 End of File  
-----------------------------------------------------------------------------------  

 

ということでここまで。

 


記事その1はこちら

【R言語&Javascript】Rスクリプトをバッチ実行する(その1) - こちにぃるの日記(今日もお疲れ様です)

 

commandArgsのDocumentationはこちら

www.rdocumentation.org

 

 

【R言語&Javascript】Rスクリプトをバッチ実行する(その1)

Rscript.exeを使ったバッチ実行ツールの記事です。

コマンドプロンプト上で、次のコマンドで実行できますが、
Rスクリプトのファイルパスや引数情報を毎回手入力するのは面倒なので、
javascriptを橋渡し役として使っています。
(こちらのコマンドだけではログも出力されないので、本記事のバッチではログ出力にも対応しています。)

Rscript.exe [Rスクリプトのファイルパス] [引数1] 

  

使い方は次の通りです。

  1. 本記事のコードをJS形式で保存します(本記事では「AutoExecファイル」と呼びます)。
    ※コード内のRscript.exeは自身の保存先パスに書き換えてください。
  2. Rスクリプト(プログラムファイル)をAutoExecファイルにドラッグ&ドロップします。
  3. javascriptが起動し、バッチ実行を開始します。
  4. バッチ実行が完了すると、logファイルが出力されます。

f:id:cochineal19:20201121225117p:plain

Rバッチの実行(例)

【バッジ実行のコード】


///--- 関数:ゼロ埋め ---///
function ZeroPadding(tval){
  return('00'+tval).slice(-2);
}

///--- ドラッグ&ドロップされたファイル名を取得 ---///
if (WScript.Arguments.Count() != 1){
  WScript.Echo('Rスクリプトファイルをドラッグ&ドロップしてください');
  WScript.Quit();
} else if (WScript.Arguments.Item(0).slice(-2).toLowerCase() != '.r') {
  WScript.Echo('Rスクリプトファイル以外をドラッグ&ドロップされました');
  WScript.Quit();
}

///--- Rscript.exeがなければ処理中止 ---///
var fso         = WScript.createObject('Scripting.FileSystemObject');
var Rscript_exe = 'C:/Program Files/R/R-4.0.1/bin/Rscript.exe';  // ここにRscript.exeのパスを指定。

if (!fso.FileExists(Rscript_exe)) {
  WScript.Echo('Rscript.exeが見つかりません。\n - 確認先パス:' + Rscript_exe);
  fso         = null;
  Rscript_exe = null;
  WScript.Quit();
}

///--- Rスクリプト情報の取得 ---///
var RscriptPath   = WScript.Arguments.Item(0).replace(/\\/g, '\/')
var RscriptFolder = fso.GetParentFolderName(RscriptPath)
var RscriptName   = fso.GetFileName(RscriptPath)

///--- 日付取得 ---///
var now1 = new Date();
var now2 = now1.getFullYear() + 
           ZeroPadding(now1.getMonth() + 1) + 
           ZeroPadding(now1.getDate()) + 
           '_' +
           ZeroPadding(now1.getHours()) + 
           ZeroPadding(now1.getMinutes()) + 
           ZeroPadding(now1.getSeconds())
           ;
var now3 = now1.getFullYear() + '年' +
           ZeroPadding(now1.getMonth() + 1) + '月' +
           ZeroPadding(now1.getDate()) + '日' +
           ' ' +
           ZeroPadding(now1.getHours()) + '時' +
           ZeroPadding(now1.getMinutes()) + '分' +
           ZeroPadding(now1.getSeconds()) + '秒'
           ;

///--- 出力ログファイル名 ---///
var LogName = RscriptFolder + '/__log_' + fso.GetBaseName(RscriptPath) + '_R_' + now2 + '.log';

///--- 実行 ---///
var wsh = WScript.createObject('WScript.Shell');
var cmd = 'echo ' + RscriptName + ' を実行中です。しばらくお待ちください。';
var cmd = cmd + ' & echo   カレントディレクトリ:' + RscriptFolder;
var cmd = cmd + ' & echo ----------------------------------------------------------------------------------- > ' + LogName;
var cmd = cmd + ' & echo  対象ファイル:' + RscriptPath + ' >> ' + LogName;
var cmd = cmd + ' & echo  実行日時  :' + now3 + ' >> ' + LogName;
var cmd = cmd + ' & echo ----------------------------------------------------------------------------------- >> ' + LogName;
var cmd = cmd + ' & "' + Rscript_exe + '" --slave --vanilla ' + RscriptPath + ' "' + RscriptFolder + '" ' + ' __error.txt >>' + LogName + ' 2>&1';
var cmd = cmd + ' & echo -- >> ' + LogName;
var cmd = cmd + ' & echo ----------------------------------------------------------------------------------- >> ' + LogName;
var cmd = cmd + ' & echo  End of File >> ' + LogName;
var cmd = cmd + ' & echo ----------------------------------------------------------------------------------- >> ' + LogName;
var cmd = cmd + ' & echo 終了しました。 & pause';

wsh.run('cmd /c ' + cmd);
  
///--- 後始末 ---///
fso           = null;
Rscript_exe   = null;
RscriptPath   = null;
RscriptFolder = null;
LogName       = null;
now1          = null;
now2          = null;
now3          = null;
wsh           = null;
cmd           = null;

 

ごちゃごちゃと長く書いていますが、次のコードが肝です。

Rscript_exe + '" --slave --vanilla ' + RscriptPath + ' "' + RscriptFolder + '" ' + ' __error.txt >>' + LogName + ' 2>&1';


分かりやすく書くと次の通り。冒頭で説明したコマンドにオプションやログ出力の設定などを加えています。

Rscript.exe --slave --valilla [Rスクリプトのファイルパス] [引数1] [ログの受取ファイル名] >> [ログファイル名(ここはコマンドプロンプトでの処理)]  2>&1

 


解説 

■[Rスクリプトのファイルパス]:

 Rコードを書いたファイル(.r形式)のフルパスです。ドラッグ&ドロップしたファイルから自動取得します。

 ■[引数1]:

 Rスクリプトが保存されているフォルダパスを文字列として設定します。本パスはグラフ等の出力先としてR内の処理で活用します。こちらも自動取得します。

 (Rスクリプト内のコード(引数の受け取り方)は次の記事に移ります。)

 ■[ログの受取ファイル名]:

 Rスクリプト内で発生するWarningやErrorメッセージ等を受け取ります。テキスト名は何でも良いです。
 ※[ログの受取ファイル名]を書かないとログに何も出力されません。

 ■[ログファイル名]  2>&1:
 コマンドプロンプト経由で、[ログの受取ファイル名]の内容を[ログファイル名]に掃き出します。[ログファイル名]は年月日_時分秒で自動生成します。
 ※2>&1 を書かないとコマンドプロンプト画面(黒い画面)にログが出るだけで、[ログファイル名]に書き出しができないようです。

 

なお、オプション指定に--vanillaをつけておくと、前回閉じたときのデータを保持せずにRを起動します。これをつけないと予期しない結果が返ってくるリスクが増しますので、つけておくべきです!

ということで、その1はここまで。

 


記事その2を更新しました。

【R言語&Javascript】Rスクリプトをバッチ実行する(その2) - こちにぃるの日記(今日もお疲れ様です)

【JavaScript】バックアップを作成するバッチ

バックアップを作成するバッチをjavascriptで書いてみました。

使い方は簡単で、本記事のコードをJS形式で保存し、任意のフォルダに配置すればOKです。ダブルクリックで実行し、同一階層にあるファイルのバックアップをとります。

 

【処理内容(実行されると・・)】

  1. 同一階層に「__Backup」フォルダがないか確認し、なければ当該フォルダを作成します。
  2. 「__Backup」フォルダ内にバックアップ用フォルダ(年月日_時分秒としました)を作成します。
  3. バックアップ用フォルダへのバックアップを開始します。

f:id:cochineal19:20201121173347p:plain

バックアップ処理の流れ(例)


///--- 関数:ゼロ埋め ---///
function ZeroPadding(tval){
  return('00'+tval).slice(-2);
}

///--- 関数:バックアップ実行 ---///
function Backup_Exec(){
  var fso = WScript.createObject("Scripting.FileSystemObject");

  //-- このスクリプトファイルのパス取得
  var ThisScriptPath = WScript.ScriptFullName;
  var ThisFolderPath = fso.GetParentFolderName(ThisScriptPath);
  var ThisScriptName = fso.GetFileName(ThisScriptPath);

  //-- 保存先設定 yyyymmdd_hhmmdd
  var now              = new Date();
  var BackupFolderName = now.getFullYear() + 
                         ZeroPadding(now.getMonth() + 1) + 
                         ZeroPadding(now.getDate()) + 
                         "_" +
                         ZeroPadding(now.getHours()) + 
                         ZeroPadding(now.getMinutes()) + 
                         ZeroPadding(now.getSeconds())
                         ;
  var BackupRootPath   = ThisFolderPath + "/__Backup/";     //バックアップの親フォルダ
  var BackupFolderPath = BackupRootPath + BackupFolderName; //バックアップ用のフォルダ
  
  //-- バックアップの親フォルダが無ければ先に作る。
  if (!fso.FolderExists(BackupRootPath)){
    fso.CreateFolder(BackupRootPath);
  }

  //-- バックアップ用のフォルダ作成。
  fso.CreateFolder(BackupFolderPath);
  
  //-- このスクリプトと同じフォルダ階層のファイルをバックアップ用フォルダにコピー。
  fso.CopyFile(ThisFolderPath + "/*", BackupFolderPath)
  
  //-- このスクリプトもコピーされちゃうので削除
  if (fso.FileExists(BackupFolderPath + "/" + ThisScriptName)){
    fso.DeleteFile(BackupFolderPath + "/" + ThisScriptName)
  }
  
  //-- 後始末
  fso              = null;
  now              = null;
  ThisScriptPath   = null;
  ThisFolderPath   = null;
  ThisScriptName   = null;
  BackupFolderName = null;
  BackupRootPath   = null;
  BackupFolderPath = null;

  WScript.Echo("終了しました");
}

///--- 実行 ---///
var shell = WScript.createObject("WScript.Shell");
var pop = shell.Popup("バックアップを作成しますか?",0,"バックアップ作成", 1 + 48);
if (pop == 1){
  Backup_Exec(); //「はい」が選択されたらバックアップ実行。
} else {
  WScript.Echo("処理を中止しました。"); //「キャンセル」が選択されたら中止。
}
shell = null;
pop   = null;

 

中身はFileSystemObjectを使ってます。

 

コマンドプロンプトでも良いですが、、

javascript触る機会少ないので、javascriptで書いてます(個人的な理由)。

【SQL Server & VBA】VBAからSQL Serverに接続し、クエリ結果をExcelシートに貼付する(ヘッダ付き)

VBAからSQL Serverに接続してクエリ結果を取得します。

Microsoft ActiveX Data Objects (ADO)を使用したDBへのアクセス方法です。

本記事はWindows認証による方法です。

 

以下の図のように、C2~4セルにサーバ名、データベース名、SQL文を入れて実行すると、6行目以降にクエリ結果が出力されるようにしました。

クエリ結果の取得の他、ヘッダー設定、表の罫線設定も一括して行う処理としています。

f:id:cochineal19:20201119221432p:plain

Excelシートのイメージ

Sub SQL接続()
'---------------------------------------
' 設定
'---------------------------------------
    On Error GoTo ERROR1
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    
    Dim ADO_CN, ADO_RS As Object
    Dim myWB As Workbook, myWS As Worksheet
    Dim SRVNM, DBNM, SQLCD, SQLINF As String
    Dim strow, enrow, encol, i As Long
    
    Set myWB = ThisWorkbook
    Set myWS = myWB.Sheets(ActiveSheet.Name)
    
    Set ADO_CN = CreateObject("ADODB.Connection")
    Set ADO_RS = CreateObject("ADODB.Recordset")
    
    '-- SQLサーバ名、DB名、SQLコード
    SRVNM = myWS.Cells(2, 3)
    DBNM = myWS.Cells(3, 3)
    SQLCD = myWS.Cells(4, 3)
    
    '--出力行
    strow = 7
    
'---------------------------------------
' 接続
'---------------------------------------
    SQLINF = "Provider=SQLOLEDB" & _
             "; Data Source=" & SRVNM & _
             "; Initial catalog=" & DBNM & _
             "; Trusted_Connection=Yes"
             
    ADO_CN.Open SQLINF
        ADO_RS.Open SQLCD, ADO_CN, 1, 1
        
            ADO_RS.movefirst
            
            '-- Sheetにデータがあれば先に削除しておく。
            enrow = myWS.UsedRange.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
            If enrow >= strow - 1 Then Rows(strow - 1 & ":" & enrow).Delete
            
            '--SQLクエリ結果をSheetに貼り付け。
            myWS.Cells(strow, 1).CopyFromRecordset ADO_RS
            
            '--ヘッダを貼り付け。Fieldsは0からなので-1する。
            For i = 1 To ADO_RS.Fields.Count
                myWS.Cells(strow - 1, i) = ADO_RS.Fields(i - 1).Name
            Next i
            
        ADO_RS.Close
    ADO_CN.Close
    
    '--罫線設定
    enrow = myWS.UsedRange.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
    encol = myWS.UsedRange.Find("*", , xlFormulas, , xlByColumns, xlPrevious).Column
    
    With myWS.Range(Cells(strow - 1, 1), Cells(enrow, encol))
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
        .Borders(xlInsideHorizontal).LineStyle = xlContinuous
    End With
    
    myWS.Range(Cells(strow - 1, 1), Cells(strow - 1, encol)).Interior.Color = RGB(137, 189, 222)
    
    '--開始行にwindowを合わせる
    ActiveWindow.ScrollColumn = 1
    ActiveWindow.ScrollRow = 1
    myWS.Cells(strow, 1).Select
    
    GoTo END1
    
'---------------------------------------
' 後始末
'---------------------------------------
ERROR1:
    MsgBox Err.Number & ":" & Err.Description
    
END1:
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Set myWB = Nothing
    Set myWS = Nothing
    Set ADO_CN = Nothing
    Set ADO_RS = Nothing

End Sub

 

内部的には

 ADO.connectionとrecordsetを使っています。

クエリ結果はcopyfromrecordsetメゾットでExcelの指定シートに貼り付けています。

 

なお、copyfromrecordsetメゾットではヘッダー情報が付きません。

Fieldsメゾットをループしてヘッダを付け加える処理をしています。

 

最大行数、最大列数の把握はFindメゾットを用いた方法を使用しました。

docs.microsoft.com

 

docs.microsoft.com

docs.microsoft.com

 

【R言語】evalとparseを使ったループ処理

さて、R関係の初記事です。

もともとSASを使っていてSASマクロを使ったループが大変便利だったわけです。

Rはそこまで柔軟ではないものの、次の方法でループ処理できます。

loop1 <- c("A","B","C")
A <- c(1,1,1)
B <- c(2,2,2)
C <- c(3,3,3)
for (i in 1:length(loop1)){
  print(paste0("ループ",i,"回目"))
  codeX <- paste0("test <- ",loop1[i], ";"
                  ,"print(sum(test))")
  eval(parse(text=codeX))
}

結果はこちら

[1] "ループ1回目"
[1] 3
[1] "ループ2回目"
[1] 6
[1] "ループ3回目"
[1] 9

ポイントはeval()とparse()です。 文字列としてcodeXに放り込んだコードを実行してくれます。

他にも方法あるでしょうが、ひとまずぐるぐる回転!

本ブログは個人メモです。 本ブログの内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。 また、本ブログ記載内容の無断転載は禁止させていただきます。