В противоположность R's deparse (заменить (var))? - PullRequest
5 голосов
/ 04 апреля 2011

В настоящее время я вызываю rp.slider из библиотеки tkrplot с несколькими аргументами в цикле, например:

rp.slider(rpplot, param1)
rp.slider(rpplot, param2)

и т.д.

В идеале я хотел бы сделать это в цикле, например,

for(i in 1:10) 
  rp.slider(rpplot, foo(paste(param,i,sep="")))

Где foo будет кодировать строку в имя переменной (символ?). rp.slider преобразует аргумент в строку, используя deparse(substitute(var)). Есть ли функция foo, которая позволит мне сделать это? Я пытался as.symbol, as.name и parse (среди прочих) безуспешно.

Любая помощь будет высоко ценится!

<ч />

Чтобы уточнить, deparse(substitute(x)) возвращает [1] "x" - Я бы хотел, чтобы был возвращен тот же вывод строки, т. Е. Какой foo выводит [1] "x" для ввода deparse(substitute(foo("x")))? Является ли это возможным?

Ответы [ 2 ]

15 голосов
/ 04 апреля 2011

Попробуйте eval(parse(text=...)) или eval(substitute(...)).

parse(text=...) превращает строку в выражение, eval вычисляет выражение. Обязательно используйте аргумент text, так как parse обычно ищет файл. Забывать, что это распространенная ошибка. Смотрите также ?parse и ?eval.

> a <- 10
> x <- deparse(substitute(a))
> eval(parse(text=x))
[1] 10

Чтобы показать, как его использовать, ваш скорректированный код:

for(i in 1:10)
  eval(parse(text=paste("rp.slider(rpplot,param",i,")",sep="")))

substitute заменяет значения в объекте языка на строки, заданные во втором аргументе:

for(i in 1:10)
  eval(
    substitute(
      rp.slider(rpplot,x),
      list(x=as.name(paste("param",i,sep="")))
    )
  )

Или, используя пример в файлах справки:

library(rpanel)
rpplot <- rp.control(title = "Demonstration of rp.tkrplot", h = 1,j=1)

redraw <- function(panel) {
  rp.tkrreplot(panel, tkrp)
}
x <- c('h','j')
rp.tkrplot(rpplot, tkrp, function(panel) plot((1:20)^panel$j, (1:20)^panel$h))

eval(parse(text=paste("rp.slider(rpplot, ",x[1]," , action = redraw,
    from = 0.05, to = 2.00, resolution = 0.05)")))

eval(
  substitute(
    rp.slider(rpplot, x, action=redraw, from=0.05, to=2.00, resolution=0.05),
    list(x = as.name(x[2]))
  )
)

Объяснение, почему это необходимо, можно найти в исходном коде rp.slider. Конструкция для получения varname внутри функции не является стандартом, используемым в R. На самом деле, использование deparse (substitute ()) категорически не рекомендуется, именно по этой причине. С большинством функций as.expression("x") работает, чтобы получить переменную, используя имя переменной. Увы, автор пакета rpanel сделал это невозможным.

0 голосов
/ 04 апреля 2011

Функция rp.slider выглядит так, как будто она находится в rpanel, а не в tkrplot.

Возможной альтернативой является использование функции tkexamp в пакете TeachingDemos, она создает графический интерфейс tk для графика (используя tkrplot)основываясь на списке, вы можете создать список в цикле, а затем вызвать tkexamp.Или вы можете посмотреть на код tkexamp, чтобы увидеть, как он анализирует список (в цикле) для создания элементов управления tk, хотя просмотр кода может отпугнуть вас от этой идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...