0

多くのR関数は、可変数の引数を取ります。 sum()例:sum(1, 2)、、、sum(1, 2, 3)およびsum(1, 2, 3, 4)はすべて有効なコマンドです。

バッチモードで実行するスクリプトを作成する必要があります。これらのスクリプトでは、関数に複数の引数を渡す必要があります。引数はコマンドラインから渡されません。それらは変数でなければなりません(変数名に対応する文字列ではありません)。それらはすべて同じクラスになり、名前は同じ文字で始まりますが、名前や引数の数はわかりません。変数を関数に渡す簡潔な方法はありますか?

次に例を示します。名前がパターンを持つすべての変数の合計を生成するコードが必要です^int\\d$。そのような変数が少なくとも1つあることは知っていますが、いくつあるかはわかりません。このコードは機能します:

# Set up toy data
int1 <- 3
int2 <- 5

# Get the sum
argNames <- ls(pat='^int\\d$')
argNames.list <- as.list(argNames)
argNames.list <- lapply(argNames.list, function (x) get(x))
do.call(sum, argNames.list)

私の異議は、このコードが少し面倒だということです。操作を4行に分散すると、明確さが低下します。より少ないコード行で同じ結果を得るR-イディオム的な方法はありますか?

4

2 に答える 2

5

これは、すべてを関数にカプセル化し、 and を削除することで、少し簡単にlapplyなりgetます。 ix一致する名前のインデックスを保持します。

# sum those arguments whose names match ^int\\d$
sumint <- function(...) {
    arg.names <- as.character(match.call()[-1])
    ix <- grep("^int\\d$", arg.names)
    do.call("sum", list(...)[ix])
}

# test    
a <- b <- 10
int3 <- 30
sumint(a, int3, b, int3, b, pi) # 60
于 2012-06-27T04:35:35.263 に答える
2

(質問に適切に対処するために編集されました)

これ以上のことはできないと思いますが、私にはかなり最小限に思えます。

int1 <- 3
int2 <- 5

do.call(sum, lapply(ls(pat="^int\\d$"), get))
# [1] 8

## Or use a safer version that will only look for objects located in the 
## environment from which it was called.  
do.call(sum, lapply(ls(pat="^int\\d$"), get, envir=parent.frame(), inherits=FALSE))
于 2012-06-26T22:10:18.903 に答える