2016-08-24 5 views
2

私は、指定された関数のデフォルトを読み込む関数をRで作成しようとしています。これを行うために、私は関数に引数argsを使用しており、関数のデフォルトの引数に分解し、それらをグローバル環境にロードしようとしています。これには少しの正規表現が必要で、これにぶつかって私は問題に取り組んでいます。ここで 正規表現括弧ではなくカンマを選択

はサンプル関数です:

私は自分自身の関数使用して、このポイントにそれを得ている
myFunc <- function(a = 1, b = "hello world", c = c("Hello", "World")) {} 

:しかし

x <- "a = 1, b = \"hello world\", c = c(\"Hello\", \"World\")" 

、私は関数の引数を分割する上で苦労していますアップ。私はカンマで区切りたいと思いますが、デフォルトの中にカンマを持つ関数の引数(cのように)があると、問題が発生します。私が考えているのは、コンマにマッチする正規表現を呼び出す方法があり、2つのかっこの間のコンマではない場合は、strsplitを使用して、自分が望むものを得ることができるということです。 2つの括弧の間にコンマの場合に一致するように

私の試みは次のようになります。

\\(.*,.*\\) 

、私は上記のものを行う方法に見てきたし、それが先かもしれない負の表情のように思えます私が必要とするものなので、私はこのようなことをしようとしました。

splitx <- strsplit(x, "(?!\\(.*,.*\\)(,)") 

しかし、Rは違法な正規表現だと言います。引数にperl = TRUEを設定すると、同じ文字列が返されます。ここのお手伝いが大変ありがとうと思います。

+1

PCRE regex - ['strsplit(x、" \\([^)] + \\)(* SKIP)(*、 "、perl = TRUE)']を使うと、 (http://ideone.com/Cw6U5n)。ただし、ここでは正規表現で盲目の路地に向かないことを確認してください。 –

+3

あなたの質問はあなたが直面している問題よりもはるかに広い範囲を持っています。 'match.call()によってあなたの目標をより速く得ることができると私が提案するならば、私は短絡しますか? –

+1

いくつかの検索で詳細がわかりますが、ここから始めることができます:http://stackoverflow.com/questions/14397364/match-call-with-default-arguments –

答えて

7

です。

関数formals()は、関数の仮引数のペアリストを返します。 is.symbol()is.null()をテストして、formals()の結果を使用することができます。シンボルではなく、nullでもないものは、デフォルト値を含みます。

get_default_args <- function(fun){ 
    x <- formals(fun) 
    w <- sapply(x, function(x)!is.symbol(x) && !is.null(x)) 
    x[w] 
} 

lm()上でそれを試してみてください:コメントはを使用することを提案することを

myFunc <- function(a = 1, b = "hello world", c = c("Hello", "World")) {} 
get_default_args(myFunc) 
$a 
[1] 1 

$b 
[1] "hello world" 

$c 
c("Hello", "World") 

注:

get_default_args(lm) 
$method 
[1] "qr" 

$model 
[1] TRUE 

$x 
[1] FALSE 

$y 
[1] FALSE 

$qr 
[1] TRUE 

$singular.ok 
[1] TRUE 

はあなたの関数でそれを試してみてください。例えば

210。これはうまく動作しないかもしれませんが、match.call()はと呼ばれた後に関数の環境で引数を評価しますが、formals()は言語オブジェクト自体を評価します。したがって、formals()を使用する場合は、この関数をまったく呼び出す必要はありません。

+0

非常にクールなもので、 'formal()'引数は非常に便利です。ありがとう! – giraffehere

+0

私の 'match.call()'のサポートはおそらく、ここでのユースケースを誤解しています。この答え( 'formals()')は、OPが達成しようとしていると思っていることを正しく処理し、私からupvoteを取得している間、正式な質問は正規表現に関するものです。 –

+0

ええ、フレットはありません。 Andrieは、私の最も重要な目標に質問の上に向かっています。 – giraffehere

1

私は、これは正しいアプローチ(使用match.call()それらが渡されたとして、引数を抽出する)であるとは思いませんがが、一致する正規表現は、私が試してみて、あなたの根本的な質問に答えるつもりです

x <- "a = 1, b = \"hello world\", c = c(\"Hello\", \"World\")" 
strsplit(x, ",(?![^()]*\\))", perl=TRUE) 

#> [[1]] 
#> [1] "a = 1"      " b = \"hello world\""   " c = c(\"Hello\", \"World\")" 
+0

私の場合、 'match.call'の問題は関数内で使用する必要がありますが、これを関数の外で使用したいと考えています。 – giraffehere

+1

はい、あなたの目標を誤解しました。 'formals()'はおそらくあなたが望むアプローチですが、あなたの質問はまだ正規表現についてのものなので、この答えです。 –

関連する問題