2017-12-22 23 views
2

ね:
建物の呼び出し()のように呼び出して、私は機能を構築したいprgramatically

my_simplecode <- "mtcars" 
call("str", as.name(my_simplecode)) 
#> str(mtcars) 

問題は、このような括弧やブラケットなど一部の記号は、コードにあるときas.name()はバッククォートを紹介することです:

my_code <- "mtcars[, 1:2]" 
call("str", as.name(my_code)) 
#> str(`mtcars[, 1:2]`) 

そして、この呼び出しを評価することはできません。 私はstr(mtcars[, 1:2])のためのコールを生成する必要がありますが、私は引用符を取り除くことはできません。 quote()、enquote()、parse()、deparse()、expression()などのすべての組み合わせを試しました。成功なし。

my_codeは、のいずれかであることができます。です。変数名、またはより一般的には関数呼び出し、パイプなどを含む任意の式。

これはUsing call() with namespace address (:: or :::)と似ていますが、機能名に問題があります。

ありがとうございました。

+0

'my_code'は名前ではありません。これは関数呼び出しです。 'parse'を使う必要があります。しかし、それはfortuneパッケージからの有名な引用を念頭に置いています:もし 'parse'が答えであれば、あなたは間違った質問をしています。 – Roland

+0

Rolandさん、ありがとうございますが、私が( "str"、parse(text = my_code))を呼び出すと、str(expression(mtcars [、1:2]))となるので、解析もうまくいきません。 さらに、my_codeは、私の最初の例のような名前を含む何でもかまいません。 –

+0

あなたは何をしたいのか、理由をより詳細に説明する必要があります。文字列を解析する必要があります。問題は次に何をすべきかですが、目標を十分に指定していません。 – Roland

答えて

0

私はquote/enquote機能のように熟達しないんだけど、それだけで特定の列の構造を取得し、この場合には、ちょうどあなたがcallに送信しようとしているもののために少し関数を記述するのは簡単かもしれません。 、

str_limited <- function(x, rows, cols) str(x[rows, cols])

あなたは、その後、としての機能がcallに入ることを使わサブセットする行および/または列の番号を呼び出すことができます。

は例えば、私は、この関数を書きました引数はcols = 1:2

call("str_limited", as.name("mtcars"), cols = 1:2)です。 eval

テストその結果を与えた:私が正しく理解していれば、あなたは評価に探していることだろう出力され、

'data.frame': 32 obs. of 2 variables: $ mpg: num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... $ cyl: num 6 6 4 6 8 6 8 4 4 6 ...

を。

私の解決策は、疑わしいときには、関数を書くことです。

+0

カミーユさんありがとう。しかし、これは最小限の例に過ぎませんでした。私はこの特定の機能を探していませんでした。 my_codeは何でもかまいませんが、実際には関数の引数から来ています。これは関数内で実際に使用されるためです。 –

0

全くエレガントないが、これは動作します:

my_code <- "mtcars[, 1:2]" 
my_lang <- eval(parse(text = paste0("quote(", my_code, ")"))) 
call("str", my_lang) 
#> str(mtcars[, 1:2]) 
関連する問題