R编程语言有反射吗?

时间:2011-07-15 02:48:42

标签: r reflection metaprogramming computer-science

R有反射吗?

http://en.wikipedia.org/wiki/Reflection_(computer_programming

基本上我想做的是:

currentRun = "run287"
dataFrame$currentRun= someVar; 

这样dataFrame$currentRun相当于dataFrame$run287 这并没有阻止我解决任何问题,但从学术角度来看,我想知道R是否支持反思编程。如果是这样,如何在给出的例子中使用反射? 谢谢!

3 个答案:

答案 0 :(得分:9)

是的,R支持反思性编程。

这是示例的R版本:

foo <- function()1

# without reflection
foo()

# with reflection
get("foo")()

可能与getassigneval相关。看到他们的在线帮助。

答案 1 :(得分:6)

在编程中不应该使用“$”运算符,因为它不会评估其参数,不像更常见的“[[”

currentRun = "run287"
dataFrame[[currentRun]]= someVar   # and the";" is superflous

> dat <- data.frame(foo = rnorm(10), bar = rnorm(10))
>  myVar <- "bar2"
> bar2 <- 1:10
>  dat[[myVar]] <- bar2
> str(dat)
'data.frame':   10 obs. of  3 variables:
 $ foo : num  -1.43 1.7091 1.4351 -0.7104 -0.0651 ...
 $ bar : num  -0.641 -0.681 -2.033 0.501 -1.532 ...
 $ bar2: int  1 2 3 4 5 6 7 8 9 10

如果myVar的属性(特别是长度)正确,则会成功。说datFrame $ currentRun等同于dataFrame $ run287是不正确的,但是字符变量可以解释为列名是正确的。还有一个eval(parse(text =“...”))构造,但最好尽可能避免。

答案 2 :(得分:1)

我不确定我是否完全掌握了维基百科的文章,但是使用[建立索引可以达到您想要的结果吗?一个简单的例子:

> dat <- data.frame(foo = rnorm(10), bar = rnorm(10))
> myVar <- "bar"
> dat[ , myVar]
 [1]  1.354046574  0.551537607  0.779769817  0.546176894 -0.194116973  0.959749309
 [7] -1.560839187 -0.024423406 -2.487539955 -0.201201268

> dat[ , myVar, drop = FALSE]
            bar
1   1.354046574
2   0.551537607
3   0.779769817
....