2015-05-30 3 views
3

У меня есть блок кода, который я хочу использовать несколько раз внутри функции (назовем ее myFunction). Я, естественно, хочу избежать дублирования этого блока кода, но я не могу найти способ повторного использования его, чтобы не помещать его во внешний файл и источник, который каждый раз. .Как повторно использовать код в функции R?

Первое, что я попытался было поставить дублирующий код во внутренней мини-функции без аргументов (назовем его internalFunction Это означало, что я мог бы назвать internalFunction по мере необходимости, но это маскируется вывод объектов по internalFunction из основная среда myFunction.

затем я попытался с помощью оператора <<- назначить выходные объектов в internalFunction, так что они будут доступны для основной среды myFunction. к сожалению, это также делает эти объекты доступных для глобальных R за пределами myFunction, которого я хочу избежать.

Есть ли способ записи блока R-кода в объект, а затем вызова этого или источника из объекта вместо файла? Я бы очень хотел: a) избежать дублирования кода и b) включить весь код в один файл.

+2

Непонятно, почему вы не можете просто вернуть объекты, которые innerFunction создает как возвращаемые значения, возвращаемые myFunction. Может быть, если вы разместите код, который вы попробовали в мини-примере, я понял, что вы имеете в виду. –

ответ

1

Я думаю, что вы хотите бы быть какой-то простой способ вернуть несколько значений функции вызывающей, это может быть сделано со списком, следующим образом:

maxmin <- function(i1,i2){ 

    if (i1>i2){ 
    mx <- i1 
    mn <- i2 
    } else 
    { 
    mn <- i1 
    mx <- i2 
    } 
    rv <- list(min=mn,max=mx) 
    return(rv) 
} 

r1 <- maxmin(3,4) 
r2 <- maxmin(6,5) 

print(sprintf("minimums %d %d",r1$min,r2$min)) 
print(sprintf("maximums %d %d",r1$max,r2$max)) 

Edit: я избавилась от котировок для имен элементов списка, они не нужны

+0

Это сработает, но я бы предпочел не возвращать их в виде списка - несколько отдельных объектов были бы предпочтительнее. – Roger

+0

AFAIK, R может вернуть только один объект, поэтому вам нужно как-то их упаковать. Я думаю, что это имеет фундаментальное значение для R. Вы также можете упаковать их как объект S4, если вы предпочитаете программирование OO, но большинство людей просто используют список. –

+0

Так это вам полезно? –

1

Вот еще один способ, но в большинстве случаев это кажется сложным и, вероятно, не является хорошим решением для разработки программного обеспечения. В основном вы можете явно получить доступ к переменной в родительской среде.

fun1 <- function(x) 
{ 
    maxminenv <- function(i1,i2){ 
     if (i1>i2){ 
     mx <- i1 
     mn <- i2 
     } else 
     { 
     mn <- i1 
     mx <- i2 
     } 
     penv <- parent.frame() 
     penv$min <- mn 
     penv$max <- mx 
    } 
    maxminenv(3,4) 
    print(sprintf("min:%d max:%d",min,max)) 
} 
fun1() 

Для получения дополнительной информации о средах см. Эту прекрасную главу в новой книге Хэдли Викама. http://adv-r.had.co.nz/Environments.html

+0

Спасибо, это очень полезный ресурс. – Roger

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