【问题标题】:Double square brackets vs single square bracket in functions or for loops函数或 for 循环中的双方括号与单方括号
【发布时间】:2020-06-22 04:15:47
【问题描述】:

所以我知道双括号仅返回元素,而单括号返回包含该元素的列表。 但是,在创建函数或 for 循环时,这在功能上有何影响?

假设我有一组 X 和 Y 值,并想为它们找到最佳斜率和 y 相交。我有一个 x 和 y 值列表(存储在 data1 中)和一个 yintersect 和斜率值列表(存储在 parameters 中)。

我想看看哪一组 y 相交和斜率值最接近实际 Y 值。因此,首先我将创建一个函数,它在给定参数列表中的一组 yintersect 和斜率值的情况下输出 y 值。该函数如下所示,标题为 modelling_function

parameters <- list(yintersect = c(1:10), slope = c(5:14))

data1 <- list(x = sample(100, 10), y = sample(200:10))

modelling_function <- function(parameters, data1) { 
parameters[[1]]+ parameters[[2]] * data1$x}

那么两个问题...

  1. 这里使用单括号和双括号有什么区别?
  2. 为什么当我运行这个函数时我只能得到 10 个值?我希望得到 10 * 10 = 100 个值,因为对于每个 x 值,有 10 种斜率和相交组合可供使用。

我知道我在这里遗漏了一些东西,我认为与每个向量/列表的具体操作有关。我希望括号和知道对每个子集列表所做的工作将帮助我弄清楚这一点。

【问题讨论】:

  • 试试看:用一个括号,Error in parameters[2] * data1$x : non-numeric argument to binary operator。这是因为parameters[2] 是一个列表,而不是一个数字向量。
  • 对于您的 data1 和参数,您将获得长度为 10 的向量,因为 parameters$yintersect 和 parameters$slope 的长度为 10,而 data1$x 的长度为 10

标签: r function


【解决方案1】:

[[ 仅用于从向量中提取一个元素,如果向量是列表,它会剥离外部结构:

a <- list(1:3, c("a", "b", "c"), 100:107)
a[[1]]

[1] 1 2 3

请注意,a[[1]] 不是一个列表,而是一个整数向量(您可以想象通过从该列表中的[相应] 位置获取一个元素来[从该列表中绘制)。

a[1]

[[1]]
[1] 1 2 3

请注意,[ 保留了结构,a[1] 返回向量的子集——在本例中,它是一个包含 1 个元素的列表。使用[,您可以对多个元素进行子集化:

a[c(1,3)]

[[1]]
[1] 1 2 3

[[2]]
[1] 100 101 102 103 104 105 106 107

您可以在其他矢量类型上使用[[[。但由于没有可剥离的外部结构,因此在对向量的 1 个元素进行子集化时,它们将返回相同的值。

x <- 1:10

x[[1]]
[1] 1

x[1]
[1] 1

x[c(1,3)]
[1] 1 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2021-09-07
    • 2010-10-14
    • 2011-01-12
    相关资源
    最近更新 更多