2

R の履歴を分析することで、オブジェクトの履歴を追跡する小さなスクリプトをまとめようとしています。Rコマンドを効率的に解析して分割することに行き詰まっています。次の R コマンドを検討してください。

for( i in 1:10 ) { a[i] <- myfunc() ; print( sprintf( "done step %d; proceeding", i ) )  }

セミコロンまたは中かっこで分割することは問題ではありませんが、引用符で囲まれたセミコロン (またはその他の特別なもの) についてはどうでしょうか? 私は char ごとに行って、not の引用符 (およびバックスラッシュの...) に含まれているかどうかを追跡することになります。これはフットワークであり、おそらく Unix が誕生した頃に発明された、もっと単純なものがあると確信しています。巧妙な正規表現ですか?

4

2 に答える 2

5

を使用しparseます。これは、解析ツリーのさまざまなコンポーネントにサブセット化できる式を返します。

x <- parse(text='for( i in 1:10 ) { a[i] <- myfunc() ; print( sprintf( "done step %d; proceeding", i ) )  }',n=1)


x[[1]]
for (i in 1:10) {
    a[i] <- myfunc()
    print(sprintf("done step %d; proceeding", i))
}

x[[1]][[1]]
`for`

x[[1]][[4]]
{
    a[i] <- myfunc()
    print(sprintf("done step %d; proceeding", i))
}

x[[1]][[4]][[2]]
a[i] <- myfunc()
于 2013-02-22T10:38:18.140 に答える
3

必要な詳細の量によって異なりますが、基本関数のほかに、非常に高速に機能し、.NET と比較してより多くの詳細を返すparseすばらしいパッケージも確認できます。クイックデモ:parserparse

> library(parser)
> parser(text='for( i in 1:10 ) { a[i] <- myfunc() ; print( sprintf( "done step %d; proceeding", i ) )  }')
expression(for (i in 1:10) {
    a[i] <- myfunc()
    print(sprintf("done step %d; proceeding", i))
})
attr(,"data")
   line1 col1 byte1 line2 col2 byte2 token id parent top_level           token.desc terminal                       text
1      1    0     0     1    3     3   270  1     77         0                  FOR     TRUE                        for
2      1    3     3     1    4     4    40  2     77         0                  '('     TRUE                          (
3      1    5     5     1    6     6   263  4     77         0               SYMBOL     TRUE                          i
4      1    7     7     1    9     9   271  6     77         0                   IN     TRUE                         in
5      1   10    10     1   11    11   261  8      9         0            NUM_CONST     TRUE                          1
6      1   10    10     1   11    11    78  9     15         0                 expr    FALSE                           
7      1   11    11     1   12    12    58 10     15         0                  ':'     TRUE                          :
8      1   12    12     1   14    14   261 11     12         0            NUM_CONST     TRUE                         10
9      1   12    12     1   14    14    78 12     15         0                 expr    FALSE                           
10     1   15    15     1   16    16    41 14     77         0                  ')'     TRUE                          )
11     1   10    10     1   14    14    78 15     77         0                 expr    FALSE                           
12     1   17    17     1   18    18   123 18     74         0                  '{'     TRUE                          {
13     1   19    19     1   20    20   263 20     22         0               SYMBOL     TRUE                          a
14     1   20    20     1   21    21    91 21     28         0                  '['     TRUE                          [
15     1   19    19     1   20    20    78 22     28         0                 expr    FALSE                           
16     1   21    21     1   22    22   263 23     25         0               SYMBOL     TRUE                          i
17     1   22    22     1   23    23    93 24     28         0                  ']'     TRUE                          ]
18     1   21    21     1   22    22    78 25     28         0                 expr    FALSE                           
19     1   19    19     1   23    23    78 28     40         0                 expr    FALSE                           
20     1   24    24     1   26    26   265 30     40         0          LEFT_ASSIGN     TRUE                         <-
21     1   27    27     1   33    33   297 32     34         0 SYMBOL_FUNCTION_CALL     TRUE                     myfunc
22     1   33    33     1   34    34    40 33     37         0                  '('     TRUE                          (
23     1   27    27     1   33    33    78 34     37         0                 expr    FALSE                           
24     1   34    34     1   35    35    41 35     37         0                  ')'     TRUE                          )
25     1   27    27     1   35    35    78 37     40         0                 expr    FALSE                           
26     1   36    36     1   37    37    59 39     74         0                  ';'     TRUE                          ;
27     1   19    19     1   35    35    78 40     74         0                 expr    FALSE                           
28     1   38    38     1   43    43   297 44     46         0 SYMBOL_FUNCTION_CALL     TRUE                      print
29     1   43    43     1   44    44    40 45     69         0                  '('     TRUE                          (
30     1   38    38     1   43    43    78 46     69         0                 expr    FALSE                           
31     1   45    45     1   52    52   297 48     50         0 SYMBOL_FUNCTION_CALL     TRUE                    sprintf
32     1   52    52     1   53    53    40 49     64         0                  '('     TRUE                          (
33     1   45    45     1   52    52    78 50     64         0                 expr    FALSE                           
34     1   54    54     1   80    80   260 52     54         0            STR_CONST     TRUE "done step %d; proceeding"
35     1   80    80     1   81    81    44 53     64         0                  ','     TRUE                          ,
36     1   54    54     1   80    80    78 54     64         0                 expr    FALSE                           
37     1   82    82     1   83    83   263 58     61         0               SYMBOL     TRUE                          i
38     1   84    84     1   85    85    41 60     64         0                  ')'     TRUE                          )
39     1   82    82     1   83    83    78 61     64         0                 expr    FALSE                           
40     1   45    45     1   85    85    78 64     69         0                 expr    FALSE                           
41     1   86    86     1   87    87    41 66     69         0                  ')'     TRUE                          )
42     1   38    38     1   87    87    78 69     74         0                 expr    FALSE                           
43     1   89    89     1   90    90   125 71     74         0                  '}'     TRUE                          }
44     1   17    17     1   90    90    78 74     77         0                 expr    FALSE                           
45     1    0     0     1   90    90    78 77      0         0                 expr    FALSE                           
于 2013-02-22T11:16:24.007 に答える