язык программирования R имеет отражение? - PullRequest
1 голос
/ 15 июля 2011

Имеет ли R отражение?

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

В основном то, что я хочу сделать, это:

currentRun = "run287"
dataFrame$currentRun= someVar; 

такое, что dataFrame$currentRun эквивалентно dataFrame$run287.
Это не помешало мне решить какие-либо проблемы, но с академической точки зрения я хотел бы знать, поддерживает ли R рефлексивное программирование.Если да, то как можно использовать отражение в приведенном примере?Спасибо!

Ответы [ 3 ]

9 голосов
/ 15 июля 2011

да, R поддерживает рефлексивное программирование.

вот пример R версии:

foo <- function()1

# without reflection
foo()

# with reflection
get("foo")()

, вероятно, имеет значение get, assign, eval. см. онлайн помощь от них.

6 голосов
/ 15 июля 2011

Не рекомендуется использовать оператор "$" в программировании, поскольку он не оценивает свой аргумент, в отличие от более общего "[["

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 = "...")), но ее лучше избегать, если это возможно.

1 голос
/ 15 июля 2011

Я не уверен, что полностью понял статью в Википедии, но достигает ли индексирование с [ желаемого результата?Тривиальный пример:

> 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
....
...