【问题标题】:R assignment to list element using single vs double brackets使用单括号和双括号对列表元素进行 R 分配
【发布时间】:2023-02-16 01:23:47
【问题描述】:

R 有两个索引运算符,[][[]]。输入单个索引时,单括号将返回列表中的该元素,而双括号将返回元素本身,而不是列表中的元素。在列表元素分配期间,我知道使用双括号是可行的方法(并且两个选项之间更合乎逻辑)。但是,下面的代码块中只有一行不成功。

my_list = vector("list", 1)

my_list[1] = 25
my_list[[1]] = 89
my_list[1] = 20:25
my_list[[1]] = 85:89

my_list[1] = 20:25 不成功,并给出以下警告:

Warning message:
In my_list[1] = 20:25 :
  number of items to replace is not a multiple of replacement length

虽然我不明白警告在这种情况下说的是什么,但该行未完成分配是有道理的。我的问题是:为什么my_list[1] = 25 会分配任务?它不应该也失败吗?

【问题讨论】:

  • 请注意,my_list[1:6] = 20:25 会起作用。似乎如果你想用 [ 分配一个原子向量,R 将在输入上运行 as.list() 或类似的。可能你想要的可以通过my_list[1:6] = list(20:25)实现
  • 我的理解是my_list[1] = 20:2520:25变成了一个有6个项目的列表,并尝试将这些项目一项一项分配到下标[1]定义的my_list的项目中。但是,由于下标只定义了第一个项目,因此只执行第一个赋值 (20),其余分配的列表项 (21:25) 将被丢弃,R 将警告您分配的左侧和右侧不匹配。
  • 使用mylist[1] 调用列表的第一个元素。您不能将长度超过 1 的任何内容分配给此列表。即列表的长度为 1,因此必须分配任何长度为 1 的内容。例如,另一个长度为 1 的列表等。请注意,mylist[1][1]mylist[1] 相同。事实上,您可以重复 [1] 几次,结果是一样的,即 mylist[1][1][1][1][1] 仍然与 mylist[1] 完全相同。另一方面,mylist[[1]] 调用第一个列表的元素而不是第一个列表本身。因此可以取很多元素
  • RTFM,或者更好的是,RTRI(R-Inferno),用于详细了解像这样的各种怪事

标签: r list


【解决方案1】:

警告消息告诉您 '赋值无法完成,因为值的长度与元素长度不匹配'.如果使用单个括号 [],则只能分配一个值。但是,当您尝试将 [20:25] 的序列分配给 my_list[1] 时,您正在替换长度为 1 的元素中长度为 6 的值,这是不成功的。如果你想使用单个括号分配一个序列,你可以将值放入 list() 中:

my_list[1] = list(20:25)

 my_list
[[1]]
[1] 20 21 22 23 24 25

希望它能有所帮助。

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多