2015-07-01 3 views
0

у меня есть (например) следующих двух функций, и пользователь выбирает, если он хочет назвать первым f1() и затем f2() или вызвать только f2():Как передать объект между двумя независимыми функциями?

f1 <- function(a, b) { 
    my_sum <- a + b 
    return(my_sum) 
} 

f2 <- function(a, b, c) { 
    my_sum2 <- a + b + c 
    return(my_sum2) 
} 

Если пользователь сначала вызывает f1(), а затем f2() он знает, что ему нужны те же самые значения, которые он присвоил a и b, когда он позвонил f1(), назначенным a и b, когда он называет f2(). Дело в том, что если он Кальесы

x1 <- f1(a = 1, b = 2) 

и при условии значения a и b рядом, когда он называет f2() Я хочу, чтобы он мог обеспечить только c аргумента и не имея снова необходимости вставить те же аргументы, a и b использовал его при вызове f1().

Например:

> x1 <- f1(a = 1, b = 2) 
> x1 
[1] 3 
> x2 <- f2(c = 2) 
Error in f2(c = 2) : argument "a" is missing, with no default 

Когда он называет x2 <- f2(c = 2) я хочу f2() принимать значения a и b от x1 <- f1(a = 1, b = 2). Как я могу это сделать? Любая помощь будет принята с благодарностью,

Бест,

Аяла

+0

Как о 'f2 <- функции (а, б, в) {если (отсутствует (a) & missing (b)) x1 + c else a + b + c} ' – ExperimenteR

+0

@ExperimenteR, это предполагает, что x1 находится в глобальной среде, которая может быть не так (хотя примерный пример выше предполагает это) – vaettchen

ответ

0

Попробуйте

f1 <- function(a, b) { 
    my_sum <- a + b 
    a<<-a 
    b<<-b 
    return(my_sum) 
} 

И f2 вы также должны объявить глобальные переменные (<<-)

, например,

a=0 
b=0 
f1 <- function(a, b) { 
    my_sum <- a + b 
    a<<-a 
    b<<-b 
    return(my_sum) 
} 
f1(4,4) 
[1] 8 
f2 <- function(a1=a, b1=b, c) { 

    my_sum2 <- a1 + b1 + c 
    return(my_sum2) 
} 
f2(c=3) 
[1] 11 
+0

Это может работать здесь, но это «жизнь рядом с вулканом» [http://www.burns-stat.com/pages/Tutor/R_inferno.pdf] (R Inferno, Circle 6) – vaettchen

0

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

# define a function that returns a vector 
f1 <- function(a, b) 
{ 
    my_sum <- a + b 
    return(c (my_sum, a, b)) 
} 
# assign the returned vector to a variable for further use 
# and extract the value you are interested in 
x1 <- (xx1 <- f1(a = 1, b = 2))[ 1 ] 
x1 
[1] 3 
xx1 
[1] 3 1 2 

# use the vector for default values for your 2nd function 
f2 <- function(c, a = xx1[2], b = xx1[3]) 
{ 
    my_sum2 <- a + b + c 
    return(my_sum2) 
} 

# if f1() was called before, only one argument: 
x2 <- f2(3) 
x2 
[1] 6 

# or all three arguments in one call 
x2 <- f2(2, 4, 3) 
x2 
[1] 9 
+0

Большое вам спасибо за ваш ответ. На самом деле я ищу решение этой проблемы в целом, и функция, которую я дал, была только примером для иллюстрации проблемы. Однако предложенное вами решение недостаточно гибко в основном из-за этой части 'x1 <- (xx1 <- f1 (a = 1, b = 2)) [1]'. Еще раз спасибо! – ayalaall

+0

Если вы немного точнее, возможно, я могу помочь. Передача только по значению и никогда не по ссылке - это вызов в R, но я к этому привык. – vaettchen

+0

Hey @vaettchen. Единственное, о чем я могу думать сейчас, это следующее: если бы был способ извлечь (в среде 'f2()') значения 'a' и' b' из среды 'f1()', что было бы замечательно. Еще раз спасибо! – ayalaall

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