【问题标题】:How to pass an object between two independent functions?如何在两个独立函数之间传递对象?
【发布时间】:2015-09-18 09:27:28
【问题描述】:

我有(例如)以下两个函数,用户选择是先调用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(),他知道他需要分配给ab时分配给f1()时分配给ab时的相同值当他打电话给f2()。问题是,如果他打电话来

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

并向ab 提供值,然后当他调用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 &lt;- f2(c = 2) 时,我希望f2()x1 &lt;- f1(a = 1, b = 2) 中获取ab 的值。 我怎样才能做到这一点? 任何帮助将不胜感激,

最好的,

阿亚拉

【问题讨论】:

  • f2 &lt;- function(a, b, c) {if(missing(a) &amp; missing(b) ) x1 + c else a + b + c} 怎么样
  • @ExperimenteR,这假设 x1 在全局环境中,但情况可能并非如此(尽管上面的示例代码表明如此)

标签: r function arguments environment


【解决方案1】:

试试

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

对于 f2 你还需要声明 global var(&lt;&lt;-)

例如

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

【讨论】:

【解决方案2】:

这可能对您的具体情况没有帮助,但总的来说,这是我解决类似问题的方法:

# 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

【讨论】:

  • 非常感谢您的回答。实际上,我通常正在寻找解决此问题的方法,而我提供的功能只是说明问题的示例。但是,您建议的解决方案不够灵活,主要是因为这部分 x1 &lt;- ( xx1 &lt;- f1( a = 1, b = 2 ) )[ 1 ]。再次感谢您!
  • 如果你更精确一点,也许我可以提供帮助。只通过值而不是通过引用传递在 R 中是一个挑战,但我已经习惯了。
  • 嘿@vaettchen。我现在唯一能想到的是:如果有办法从f1() 的环境中提取(在f2() 的环境中)ab 的值,那就太好了。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多