如何获取R代码表达式中的所有变量?

时间:2015-09-02 18:55:30

标签: r

如何解码R中的表达式以获取所有变量?

例如,如果你有:

z<-x+y;

get_all_variables(z);

[1] 'x' 'y'

2 个答案:

答案 0 :(得分:8)

您可以使用all.vars,但需要引用您的表达式:

all.vars(quote(x + y))
# [1] "x" "y"

您不能只使用z,因为它描述它包含评估的表达式(即表达式的结果),而不是表达式本身。您可以编写一个删除一个步骤的函数:

get_all_variables <- function(expr) all.vars(substitute(expr))
get_all_variables(x + y)
# [1] "x" "y"

但除非您z或{{}}创建z,否则您将无法从z <- quote(x + y)恢复该表达式。

如果你有一个字符串中的表达式,那么你可以使用@ sunny的技术与all.vars结合使用:

all.vars(parse(text="z <- x + y"))
# [1] "z" "x" "y"

虽然显然你也得到z。与往常一样,如果有人Bobby Tables,请不要使用parse评估任意文字。

答案 1 :(得分:1)

据我所知,您需要将表达式存储在字符串中。然后,您可以使用getParseData解析它:

txt <- "z<-x+y"

sf <- srcfile("txt")   
df = getParseData(sf)    
df$text[df$token=="SYMBOL"][2:3]

为了进一步启发,以下是getParseData的完整结果:

   line1 col1 line2 col2 id parent       token terminal text
11     1    1     1    6 11      0        expr    FALSE     
1      1    1     1    1  1      3      SYMBOL     TRUE    z
3      1    1     1    1  3     11        expr    FALSE     
2      1    2     1    3  2     11 LEFT_ASSIGN     TRUE   <-
10     1    4     1    6 10     11        expr    FALSE     
4      1    4     1    4  4      6      SYMBOL     TRUE    x
6      1    4     1    4  6     10        expr    FALSE     
5      1    5     1    5  5     10         '+'     TRUE    +
7      1    6     1    6  7      9      SYMBOL     TRUE    y
9      1    6     1    6  9     10        expr    FALSE