6

関数内のステートメントに 1 つの要素として渡したい論理演算子と数値があります (何百人もの R ユーザーがうめき声を上げているのを聞いています。私はこれを決してしませんが、問題ないと感じる状況があります)。

DF <- mtcars
overlap = "> 2"
as.numeric(rowSums(DF[, 1:6]) overlap)

3行目を次のように機能させるにはどうすればよいですか:

as.numeric(rowSums(DF[, 1:6]) > 2)

可能性が高いことはわかっていevalますparseが、決して使用しないため、ここでの使用方法がよくわかりません。

4

3 に答える 3

7

何かのようなもの

Olap <- unlist(strsplit( overlap, " "))
Thresh <- as.numeric(Olap[2])
Comp <- match.fun(Olap[1])
Comp(rowSums(DF[,1:6]), Thresh)

代替手段は、あなたが提案したように eval と parse です

What <- rowSums( DF[,1:6])

 textcall <- sprintf(" What %s", overlap)

 exprcall <- parse(text = textcall)

 eval( exprcall)
于 2012-11-12T06:27:44.000 に答える
7

式全体を文字列に変換してから、解析されたテキストを式に変換する必要があります。最後に、式に対して eval() を呼び出します。

例えば:

overlap <- "> 2"

# Convert to string
exprAsString <- paste0("as.numeric(rowSums(DF[, 1:6]) ", overlap, ")")

# Convert to expression, using parse
expr <- as.expression(parse(text=exprAsString))

# Then call eval()
eval(expr)

動作確認:

identical(eval(expr), as.numeric(rowSums(DF[, 1:6]) > 2))
# [1] TRUE
于 2012-11-12T09:02:45.927 に答える
1

@mnelのソリューションは優れていますが、これは、メイン関数内にダミー関数を作成し、入力文字列(overlap)を引数として変更することで解決できる状況だと思いますbody(dummy_function)。それはずっときれいかもしれません。

于 2012-11-12T12:12:42.317 に答える