【问题标题】:Function return value changes if use local variable如果使用局部变量,函数返回值会发生变化
【发布时间】:2012-12-03 00:36:54
【问题描述】:

我有两个 sn-ps 代码,我希望它们的行为相同,但它们没有:

  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 来绘制曲线。对于第一个 sn-p,没有绘制曲线。使用第二个 sn-p 绘制曲线。

这两个sn-ps在功能上有什么区别,为什么?

【问题讨论】:

    标签: r


    【解决方案1】:

    返回的内容取决于传递的参数类型。如果参数“t”是一个矩阵,正如设计用于处理坐标的函数所期望的那样,则从cosh(t)sinh(t) 返回一个矩阵。

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

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

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

    【讨论】:

      【解决方案2】:

      结果

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

      是一个长度为2 * length(t)的数值向量。

      命令

      return(coordinates[1])
      

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

      coordinates <- c(cosh(t), sinh(t))
      
      return(coordinates[seq_along(t)])
      

      【讨论】:

      • 谢谢。这是一个进步。但现在我无法将向量添加到列表中,并对其进行矩阵乘法。
      • @Randomblue 我相应地修改了我的答案。
      • 我很困惑。 seq_along 是做什么的?在您的示例中,x 是什么?我要修改position(如position + c(1, 1)),然后提取第一个坐标。
      • @Randomblue 抱歉,我将 x 替换为 t。函数seq_along(t) 创建一个从1 到length(t) 的序列。例如:seq_along(c(3,5,2,6,1)) == c(1, 2, 3, 4, 5).
      • seq_along 操作是不必要的。仅使用 return(coordinates) 会得到相同的结果,但如果目标是返回一个矩阵,则导致问题的是 c() 步骤。
      【解决方案3】:

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

        coordinates[[1]]
      


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

      也试试

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

      【讨论】:

      • 如果您查看 cosh(t) 和坐标[1] 的输出,您会发现它们明显不同。正如@sven 指出的那样,你想使用一个列表,并且你想用双括号引用。
      • "coordinates" 不能是列表,因为 coshsinh 将返回矩阵或向量(如果 t 是列表则返回错误)。所以 c(cosh(t),sinh(t)) 将是一个向量,使用 "[[" 会导致错误。
      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多