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

R 如果使用局部变量,函数返回值将更改,r,R,我有两段代码,我希望它们的行为是相同的,但它们不是: position <- function(t) { coordinates <- c(cosh(t), sinh(t)) return(coordinates[1]) } position在第一个示例中使用双括号 coordinates[[1]] 作为故障排除时的有用提示,如果您使用两个不同函数的str(位置(x))探索这两个函数的输出,您应该会看到差异 也试试 str(vec[1])

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

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

    return(coordinates[1])
  }

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

  coordinates[[1]]


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

也试试

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

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

  coordinates[[1]]


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

也试试

   str(vec[1])
   str(vec[[1]])
结果

coordinates <- c(cosh(t), sinh(t))
仅返回此向量的第一个值。(只有当
长度(t)=1
时,
坐标[1]
cosh(t)
的结果才是相同的)要返回
cosh(h)
的结果,您可以根据
t
的长度按顺序索引
坐标

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

return(coordinates[seq_along(t)])
坐标的结果

coordinates <- c(cosh(t), sinh(t))
仅返回此向量的第一个值。(只有当
长度(t)=1
时,
坐标[1]
cosh(t)
的结果才是相同的)要返回
cosh(h)
的结果,您可以根据
t
的长度按顺序索引
坐标

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

return(coordinates[seq_along(t)])

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

第一个函数只返回形成的矩阵的第一个元素,然后将其“拉直”,因为
c
函数导致其尺寸松散。如果要保留矩阵字符,则根据处理数据的下一个函数,使用
rbind
cbind

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


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

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

第一个函数只返回形成的矩阵的第一个元素,然后将其“拉直”,因为
c
函数导致其尺寸松散。如果要保留矩阵字符,则根据处理数据的下一个函数,使用
rbind
cbind

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


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

如果您查看cosh(t)和坐标[1]的输出,您会发现它们明显不同。正如@sven所指出的,你想要使用一个列表,你想要用双括号引用。“坐标”不能是一个列表,因为
cosh
sinh
将返回矩阵或向量(或者如果t是一个列表,则返回一个错误)。所以c(cosh(t),sinh(t))将是一个向量,使用“[[”将导致一个错误。如果你看cosh(t)和坐标[1]的输出,你会发现它们明显不同。正如@sven指出的,你想要使用一个列表,你想要用双括号引用。“坐标”不能是列表,因为
cosh
sinh
将返回矩阵或向量(如果t是列表,则返回错误)。因此c(cosh(t),sinh(t))将是向量,并使用“[[”会导致错误。谢谢。这是向前迈出的一步。但现在我无法向列表中添加向量,并对其进行矩阵乘法。@Randomblue我相应地修改了我的答案。我很困惑。
seq_沿途做了什么?
x
在您的示例中是什么?我想修改
位置
(例如
位置+c(1,1)
),然后提取第一个坐标。@对不起,我用
t
替换了
x
。函数
seq\u-along(t)
创建一个从1到
length(t)
的序列。例如:
seq\u-along(c(3,5,2,6,1))==c(1,2,3,4,5)
seq_沿途
操作是不必要的。只需
返回(坐标)
就可以得到相同的结果,但如果目标是返回矩阵,则是
c()
导致问题的步骤。谢谢。这是向前迈出的一步。但现在我无法向列表中添加向量,并对其进行矩阵乘法。@Randomblue我相应地修改了我的答案。我很困惑。
seq_沿途做了什么?
在你的示例中是什么?
x
我想修改
位置
(例如
位置+c(1,1)
),然后提取第一个坐标。@trandomblue抱歉,我用
t
替换了
x
。函数
seq_-along(t)
创建一个从1到
长度(t)
的序列。例如:
seq_-along(c(3,5,2,6,1))==c(1,2,3,4,5)
。不需要
seq_-along操作。您可以