2013-03-13 2 views
9

Я написал функцию, которая делает графики. Одна из проблем, с которыми я сталкиваюсь, - это необходимость создания воспроизводимых графиков. Разумеется, одно из решений - сохранить код для каждого графика, который я создаю (т. Е. Сохранить точные значения, которые я задал для аргументов функции). Интересно, однако, если есть способ, которым я могу захватить все входные значения, включая объект данных и т. Д., И сохранить их в списке и вернуть его в качестве вывода. Простой способ сделать это, я полагаю, заключается в следующем:R: есть способ захватить все значения аргумента функции

plot.foo <- function(x, main=NULL){ 
    plot(x, main=main) 
    list(data=x, main=main) 
} 

Однако функция я написал имеет кучу аргументов в дополнение к многоточие аргумента (см ниже), так что мне интересно, если есть более быстрый способ сохранить все значения входных аргументов. Благодаря!

plot.foo <- function(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10,...){ 
    ... 
} 

ответ

15

Есть множество функций, которые могут быть полезны: match.call, match.arg, а затем существуют специальные методы для извлечения ... аргументов.

plot.foo <- 
    function(x, main=NULL){ 
    cl <- match.call() 
    print(cl) 
    plot(x, main=main) 
    list(data=x, main=main) 
    } 

plot.foo(1) 
## plot.foo(x = 1) 
## $data 
## [1] 1 
## 
## $main 
## NULL 

plot.foo <- 
    function(x, main=NULL, ...){ 
    extras=list(...) 
    print(extras) 

    cl <- match.call() 
    print(cl) 

    plot(x, main=main) # this would actually produce the grapjic 
    list(data=x, main=main, extras=extras) # this returns the arguments as a list 
    } 

plot.foo(1, sthg="z") 
## $sthg 
## [1] "z" 

# You could assign the returned list to a name or you could `save` to a file 
plot.foo(x = 1, sthg = "z") 
## $data 
## [1] 1 
## 
## $main 
## NULL 

Существует также sys.call функции, результат может быть возвращена в виде текста с deparse.

5

С самого начала, сделать именованный список всех аргументов сюжетных

L <- list(x=data, main="string", ylim=c(0,10)) 

Затем сюжет, используя этот объект в качестве набора параметров

do.call("plot", L) 

Убедитесь, чтобы сохранить L для позже использование.

Рабочий пример:

L<-list(x=1:10, y=(1:10)^2, main="Y by X",type="l",xlab="X",ylab="Y") 
do.call("plot",L) 
Смежные вопросы