如果使用局部变量,函数返回值会更改

时间:2012-12-02 15:58:28

标签: r

我有两个代码片段,我希望它们的行为相同,但它们不会:

  position <- function(t) {
    coordinates <- c(cosh(t), sinh(t))

    return(coordinates[1])
  }

  position <- function(t) {
    coordinates <- c(cosh(t), sinh(t))

    return(cosh(t))
  }

我使用函数position绘制曲线。对于第一个片段,不绘制曲线。使用第二个片段绘制曲线。

两个片段之间的功能差异是什么?为什么?

3 个答案:

答案 0 :(得分:3)

返回的内容取决于传递的参数类型。如果参数“t”是设计用于处理坐标的函数可能需要的矩阵,则从cosh(t)sinh(t)返回矩阵。

第一个函数只返回形成的矩阵的第一个元素,然后“整理”,因为c函数导致它松散。如果您想保留矩阵字符,请使用rbindcbind,具体取决于处理数据的下一个函数。

第二个函数首先计算“坐标”,然后让它消失在垃圾收集器中,因为它返回由cosh(t)形成的矩阵。

您现在无法获得更好的答案,因为您现在正在猜测您传递给函数的数据结构类型。您应该将dput()的结果发布到此函数的参数上。您应该告诉我们绘图函数的帮助页面需要什么作为参数类型。

答案 1 :(得分:1)

的结果
coordinates <- c(cosh(t), sinh(t))

是长度为2 * length(t)的数字向量。

命令

return(coordinates[1])

仅返回此向量的第一个值。 (coordinates[1]cosh(t)的结果仅在length(t) == 1时相同。)要返回cosh(h)的结果,您可以使用基于的序列索引coordinates t的长度:

coordinates <- c(cosh(t), sinh(t))

return(coordinates[seq_along(t)])

答案 2 :(得分:0)

在第一个示例中使用双括号。

  coordinates[[1]]


作为故障排除时的一个有用提示,如果您使用str(position(x))探索两个函数的两个不同函数的输出,您应该看到差异。

尝试

   str(vec[1])
   str(vec[[1]])