2016-07-19 3 views
0

Я пытаюсь создать функцию, где аргумент по умолчанию задается переменной, которая существует только в среде временно, например:Наследование R аргумент функции от глобальной переменной

arg=1:10 
test=function(x=arg[3]){2*x} 

> test() 
[1] 6 

выше работает отлично, до тех пор, поскольку arg существует в среде функций. Однако, если я удалю ARG:

> rm(arg) 
> test() 
> Error in test() : object 'arg' not found 

Есть ли способ, например, что аргумент по умолчанию принимается 3, даже если аргумент перестает существовать? Я чувствую, что правильный ответ включает в себя некоторую смесь eval, quote и/или замены, но я не могу найти правильное заклинание.

+0

Что вы пытаетесь достичь? Вы можете изменить 'test'' environment' и назначить 'arg' там -' environment (test) = new.env(); environment (test) $ arg = 1: 10', если вы хотите удалить 'arg' из глобальной среды. –

+0

Существует несколько маршрутов, которые бы достигли аналогичного поведения, но я думаю, я просто хочу знать, можно ли оценивать значение аргумента статически. В крайнем случае я мог четко написать все как скрипт (с 3-м элементом аргумента, который вычисляется явно как 3 и устанавливается как значение по умолчанию для x) и источник этого. Есть ли способ достичь этого полностью в среде R? – ASGR

+0

Вы можете 'eval' аргументы и повторно назначить их с помощью' 'formals <-" '- например. 'formals (test) $ x = eval (formals (test) $ x)'. Вы также можете сделать промежуточную функцию, которая оценивает свои аргументы и возвращает функцию с оцененными аргументами. –

ответ

1

Правильный способ сделать это, на мой взгляд было бы:

test <- function(x=3) { 2 *x } 

, а затем вызвать его с аргументом:

arg<-1:10 
test(arg[3]) 

Таким образом, значение по умолчанию равно 3, то вы передаете его аргумент, который вы хотите использовать во время выполнения, если вы вызываете его без аргумента test(), он будет использовать значение по умолчанию.

1

Сообщение выше получило меня на правильном пути. Использование формалей:

arg=1:10 
test=function(x){x*2} 
formals(test)$x=eval(arg[3]) 
rm(arg) 
test() 

[1] 6

И это то, что я искал, чтобы достичь.

Смежные вопросы