代码之家  ›  专栏  ›  技术社区  ›  Marian Minar rcs

通过pmap将一个参数映射到赋值函数上会生成一个列表,而不是环境中的对象(根据需要)。

  •  2
  • Marian Minar rcs  · 技术社区  · 6 年前

    序言: A related SO question that I tried to emulate ,但收到了相同(不正确)的结果。

    我正试图将一组参数传递给 assign 通过 purrr::pmap . 我的参数 tibble 有两列:名称( chr )和数据( tbl_df )一个小的、可重复的例子:

    x <- c("One", "Two", "Three")
    
    value <- list(
      mtcars,
      iris,
      rock
    )
    
    params <- tibble(x = x, value = value)
    
    pmap(params, assign)
    

    输出只是数据帧列表(mtcars、iris、rock),但是 环境中不创建任何对象(“1”、“2”、“3”)(根据需要) . 我试过了 map2 ,按照上文所述内容:

    map2(.x = x, .y = value, .f = ~ assign(.x, .y))
    

    …它提供相同的不需要的输出(数据帧列表)。

    蒂亚

    答案的基准测试结果

    我很好奇这些函数将如何执行。这里唯一的区别是为了节省计算,我创建了一个命名的数据帧表,然后应用 get 这是我的代码使用 rbenchmark :

    rbenchmark::benchmark( 
    
      map2 = {
        x <- c("One", "Two", "Three")
    
        value <- list(
          "mtcars",
          "iris",
          "rock"
        )
    
        purrr::map2(.x = x, .y = value, .f = ~ assign(.x, get(.y), envir = .GlobalEnv))
      },
    
      walk2 = {
        x <- c("One", "Two", "Three")
    
        value <- list(
          "mtcars",
          "iris",
          "rock"
        )
    
        purrr::walk2(.x = x, .y = value, .f = ~ assign(.x, get(.y), envir = .GlobalEnv))
      },
    
      list2env = {
        x <- c("One", "Two", "Three")
    
        value <- list(
          "mtcars",
          "iris",
          "rock"
        )
    
        list2env(setNames(lapply(value, get), x), envir = .GlobalEnv)
      },
      replications = 10000,
      columns = c("test", "replications", "elapsed",
                  "relative", "user.self", "sys.self")
    )
    

    结果:

          test replications elapsed relative user.self sys.self
    3 list2env        10000    0.14      1.0      0.14     0.00
    1     map2        10000    1.05      7.5      0.91     0.02
    2    walk2        10000    4.20     30.0      4.20     0.00
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   akrun    6 年前

    中的另一个选项 base R 将提取 list 列转换为已命名的 列表 使用 list2env

    list2env(setNames(params$value, params$x), envir = .GlobalEnv)
    
        2
  •  2
  •   www    6 年前

    请加 envir = .GlobalEnv 对你 assign map2 打电话。此外,在这种情况下, 微管相关蛋白2 会打印出一份清单。如果你不喜欢,你可以用 walk2 如下所述。

    walk2(.x = x, .y = value, .f = ~ assign(.x, .y, envir = .GlobalEnv))