如何用 purrr 替换修改 for 循环

2023-12-23

我想用 purrr 替代方案替换简单的 for 循环。我该如何编码并保持对象的原始结构

这是我的例子:

my_list <- list(
      a = list(
        list(
          aaa = c(1:3),
          aab = c(4:6), 
          aac = c(7:9)),
        list(
          aaa = c(10:12),
          aab = c(13:15), 
          aac = c(16:18)),
        list(
          aaa = c(19:21),
          aab = c(22:24), 
          aac = c(25:27))
      ))

和我原来的解决方案

x <- purrr::map_lgl(my_list$a, .f = ~ !is.null(.x$aaa))

my_list1 <- my_list
for (i in which(x)) {
      my_list1$a[[i]]$aaa <- 99
}
str(my_list1)

但是,我也想用 purrr 解决方案替换我的 for 循环。我尝试了类似的方法,但地图总是返回一个新列表,而不是仅仅更新它

my_list2 <- map(c(1, 3),
        function(x){
          my_list[["a"]][[x]][["aab"]] <- 99
          return(my_list)
        }
)
str(my_list2)

修改应该更适用于这种情况,但我也无法使其工作。

my_list3 <- purrr::map(
      .x = which(x), 
      .f = function(i = .x) {
        purrr::modify_in(.x = my_list, 
                         .where = list("a", i, "aaa"), 
                         .f = ~99)
      }
)
str(my_list3)

新列表的结构应与初始列表相同:

# str(my_list)
List of 1
 $ a:List of 3
  ..$ :List of 3
  .. ..$ aaa: int [1:3] 1 2 3
  .. ..$ aab: int [1:3] 4 5 6
  .. ..$ aac: int [1:3] 7 8 9
  ..$ :List of 2
  .. ..$ aab: int [1:3] 13 14 15
  .. ..$ aac: int [1:3] 16 17 18
  ..$ :List of 3
  .. ..$ aaa: int [1:3] 19 20 21
  .. ..$ aab: int [1:3] 22 23 24
  .. ..$ aac: int [1:3] 25 26 27

# str(my_list1) is correct
List of 1
 $ a:List of 3
  ..$ :List of 3
  .. ..$ aaa: num 99
  .. ..$ aab: int [1:3] 4 5 6
  .. ..$ aac: int [1:3] 7 8 9
  ..$ :List of 2
  .. ..$ aab: int [1:3] 13 14 15
  .. ..$ aac: int [1:3] 16 17 18
  ..$ :List of 3
  .. ..$ aaa: num 99
  .. ..$ aab: int [1:3] 22 23 24
  .. ..$ aac: int [1:3] 25 26 27

# str(my_list2) or str (my_list3) is not correct
List of 2
 $ :List of 1
  ..$ a:List of 3
  .. ..$ :List of 3
  .. .. ..$ aaa: num 99
  .. .. ..$ aab: int [1:3] 4 5 6
  .. .. ..$ aac: int [1:3] 7 8 9
  .. ..$ :List of 2
  .. .. ..$ aab: int [1:3] 13 14 15
  .. .. ..$ aac: int [1:3] 16 17 18
  .. ..$ :List of 3
  .. .. ..$ aaa: int [1:3] 19 20 21
  .. .. ..$ aab: int [1:3] 22 23 24
  .. .. ..$ aac: int [1:3] 25 26 27
 $ :List of 1
  ..$ a:List of 3
  .. ..$ :List of 3
  .. .. ..$ aaa: int [1:3] 1 2 3
  .. .. ..$ aab: int [1:3] 4 5 6
  .. .. ..$ aac: int [1:3] 7 8 9
  .. ..$ :List of 2
  .. .. ..$ aab: int [1:3] 13 14 15
  .. .. ..$ aac: int [1:3] 16 17 18
  .. ..$ :List of 3
  .. .. ..$ aaa: num 99
  .. .. ..$ aab: int [1:3] 22 23 24
  .. .. ..$ aac: int [1:3] 25 26 27

有什么提示我的 purrr 出错了吗?


鉴于要修改的列表组件位于第二个嵌套级别,您还可以直接访问它们modify_depth:

library(purrr)

my_list <- modify_depth(my_list, 2, ~list_modify(.x, aaa = 99))

str(my_list)
#> List of 1
#>  $ a:List of 3
#>   ..$ :List of 3
#>   .. ..$ aaa: num 99
#>   .. ..$ aab: int [1:3] 4 5 6
#>   .. ..$ aac: int [1:3] 7 8 9
#>   ..$ :List of 3
#>   .. ..$ aaa: num 99
#>   .. ..$ aab: int [1:3] 13 14 15
#>   .. ..$ aac: int [1:3] 16 17 18
#>   ..$ :List of 3
#>   .. ..$ aaa: num 99
#>   .. ..$ aab: int [1:3] 22 23 24
#>   .. ..$ aac: int [1:3] 25 26 27

注意:这也适用于第一个列表级别的多个列表组件(例如$a, $b,...),无需添加额外的迭代步骤。


编辑:如文档中所列modify_depth:

modify_depth(x, 2, fun) 等价于 x

为了仅替换第二个嵌套级别上的列表组件的选择,我们可以重写对modify_depth以更详细的方式:

library(purrr)

## replace aaa only for components 1 and 3
modify_loc <- c(TRUE, FALSE, TRUE)

my_list <- modify(my_list, ~imodify(., ~if(modify_loc[.y]) list_modify(.x, aaa = 99) else .x))

str(my_list)
#> List of 1
#>  $ a:List of 3
#>   ..$ :List of 3
#>   .. ..$ aaa: num 99
#>   .. ..$ aab: int [1:3] 4 5 6
#>   .. ..$ aac: int [1:3] 7 8 9
#>   ..$ :List of 3
#>   .. ..$ aaa: int [1:3] 10 11 12
#>   .. ..$ aab: int [1:3] 13 14 15
#>   .. ..$ aac: int [1:3] 16 17 18
#>   ..$ :List of 3
#>   .. ..$ aaa: num 99
#>   .. ..$ aab: int [1:3] 22 23 24
#>   .. ..$ aac: int [1:3] 25 26 27
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用 purrr 替换修改 for 循环 的相关文章

随机推荐

  • 拖放图像视图不起作用

    My RelativeLayout有图像 我只是想让它在整个布局中可拖动 问题是每次我拖放时 它都会回到原始位置 这是我的 拖拽布局 xml
  • 将彩信标记为以编程方式读取

    是否有办法更新彩信 短信数据库以将消息从已读标记为未读 反之亦然 我尝试过使用 URI 但它们对我不起作用 下面的代码可以帮助我更新彩信是否被标记为已查看 要将其用于 SMS 消息 只需将以下 content mms 替换为 content
  • Mod 重写并传递 URL 作为参数

    我在重写 mod 时遇到了一个小问题 我的一个朋友正在编写一个允许您上传图像的脚本 我们想要做的是允许用户将域名附加到直接图像链接 并且脚本将从提供的 URL 检索图像 例如 如果图像位于 http www test com image j
  • SVG 填充子元素的宽度

    我希望我的容器 SVG 元素能够缩放 以适应其子组元素或在溢出时显示滚动条 我想知道是否有一个 css 属性可以做到这一点 例如 如果标记如下所示 div class wrapper style width 500px div
  • 如何使用伪类选择除第一个和最后一个之外的所有子级?

    在 CSS 中 对于下面所示的示例 如何才能将样式应用于除第一个和最后一个段落之外的所有段落 div class entry p p p p p p p p p p div 我已尝试以下方法来排除第一段 但这不起作用 div entry p
  • OpenCV 的 iPhone 6 相机校准

    我正在使用 OpenCV 开发 iOS 增强现实应用程序 我在创建相机投影矩阵以允许 OpenGL 叠加层直接映射到标记顶部时遇到问题 我觉得这是因为我的 iPhone 6 摄像头没有根据应用程序正确校准 我知道有 OpenCV 代码可以使
  • UIScrollView 覆盖我的子视图的平移手势识别器

    如果我有一个带有子视图的滚动视图 并且子视图有一个平移手势识别器 则滚动视图的平移手势覆盖子视图的平移 我认为我想要的是相反的 所以我拖动一个子视图 它将在滚动视图中平移 但如果我触摸另一个区域 滚动视图将像平常一样平移 有没有简单的方法来
  • 在 Silverlight 拖放中获取放置索引

    This article http themechanicalbride blogspot com 2009 10 silverlight drag drop support part 2 html展示如何对放置事件实现复制操作 我想做同样
  • 在不使用背景颜色的情况下向 HTML 表格单元格添加背景颜色?

    除了背景颜色样式属性之外 还有其他方法可以向表格单元格添加 背景 颜色吗 我有一些表格 其中包含以编程方式生成的文本内容和背景颜色 它们可能会自行更新 我想暂时突出显示某些单元格 想象一下移动的光标 理想情况下不会触及现有代码或干扰背景颜色
  • 如何在设计时打开 WPF 菜单?

    我正在 WPF 中设置菜单样式 并且希望看看它的外观 而无需启动应用程序来打开菜单 有没有办法在设计时保持菜单打开 以便我可以看到菜单项 以便我可以随时看到更改 我目前只有 Visual Studio 2010 可以使用 您可以设置 IsS
  • 绝对值函数“fabsf”给定“double”类型的参数,但具有“float”类型的参数,这可能会导致值截断?

    鉴于此代码示例 CGFloat a 1 CGFloat b 2 CGFloat c fabsf a b 当前的 Xcode beta 编译器给了我这个警告 Absolute value function fabsf given an arg
  • C++ 错误:“成员 Eng​​ine::x 不是类型名称”

    我正在构建一个标准的 4 函数计算器 并且尝试将两个数字作为用户输入的参数传递 在我的 Engine h 类中我已经声明了 float num1 num2 我有这个功能 float Add num1 num2 在这些参数中 num1 和 n
  • MongoDB 空字段或 true/false

    在 MongoDB 上 当我们有 草稿 是 否 已发布 是 否 等字段时 哪个是最好的策略 在所有记录中创建字段并输入 是 否 值 还是将字段放在存在的位置 posts id 1 text hello draft true id 2 tex
  • Azure 配额超出异常

    当向通知中心发送通知时 我收到以下异常 Microsoft ServiceBus Messaging QuotaExceededException 远程 服务器返回错误 禁止 最大数量 通知操作已达到或超过 实际 33360 允许的最大值
  • 如何从文件中删除重复项并写入同一个文件?

    我知道我的标题不太容易解释 但让我尝试在这里解释一下 我有一个文件名test txt其中有一些重复的行 现在 我想做的是删除那些重复的行 同时update test txt与新内容 test txt AAAA BBBB AAAA CCCC
  • Swift:将枚举值转换为字符串?

    给定以下枚举 enum Audience case Public case Friends case Private 我如何获取字符串 Public 来自audience下面常数 let audience Audience Public 获
  • 访问组合框值

    I have a combobox and a button that makes runs a query with the values it gets from combobox but it does not seem to get
  • 绑定到 ItemsControl 的 DataTemplate 内的自定义控件

    我的绑定有问题DataTemplate基于定义的DataType in ItemsControl 当我想绑定到我的自定义用户控件 为了演示目的 我创建了简单的物品类别例如 我有这样的项目集合 public class Item public
  • 将 Textview 放在列表片段之上

    如何在片段顶部添加文本视图 我使用以下适配器来填充列表片段 并且 xml 文件是列表片段中的每一行 我需要在列表视图之上添加一个文本视图 该文本视图必须可以与列表一起滚动 public class Adapter extends BaseA
  • 如何用 purrr 替换修改 for 循环

    我想用 purrr 替代方案替换简单的 for 循环 我该如何编码并保持对象的原始结构 这是我的例子 my list lt list a list list aaa c 1 3 aab c 4 6 aac c 7 9 list aaa c