Как повторно использовать код в функции R?
У меня есть блок кода, который я хочу использовать несколько раз внутри функции (давайте назовем его myFunction
). Естественно, я хочу избежать дублирования этого блока кода, но я не могу найти способ его повторного использования, за исключением помещения его во внешний файл и получения его каждый раз.
Первым делом я попытался поместить дублированный код во внутреннюю мини-функцию без аргументов (назовем ее internalFunction
, Это означало, что я мог позвонить internalFunction
по мере необходимости; однако, это замаскировало объекты, выведенные internalFunction
из основной среды myFunction
,
Затем я попытался с помощью <<-
оператор для назначения выходных объектов в internalFunction
, чтобы они были доступны для основной среды myFunction
, К сожалению, это также делает эти объекты доступными для глобальной среды R за пределами myFunction
, которого я хочу избежать.
Есть ли способ записи блока кода R в объект и последующего его вызова или поиска из объекта вместо файла? Я бы очень хотел: а) избежать дублирования кода и б) включить весь код в один файл.
2 ответа
Я думаю, что вы хотите, чтобы был какой-то простой способ вернуть несколько значений вызывающей функции, это можно сделать с помощью списка, как показано ниже:
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))
Редактировать: я избавился от кавычек для имен элементов списка, они не нужны
Вот другой способ, но он кажется сложным и в большинстве случаев, вероятно, не является хорошим решением для разработки программного обеспечения. По сути, вы можете явно получить доступ к переменной в родительской среде.
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