【问题标题】:how to use purrr with lubridate如何将 purrr 与 lubridate 一起使用
【发布时间】:2018-02-21 06:06:28
【问题描述】:

考虑这个简单的例子

mydata
List of 3
 $ : chr "11/12/2015"
 $ : chr "21/10/2015"
 $ : chr "04/09/2015"

我想将lubridate::dmy() 应用于此列表中的每个字符。 简单的运行

mydata %>% map(., lubridate::dmy(.))
Error: Can't convert a double vector to function

产生错误。我在这里想念什么? 谢谢!

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    这是错误的,因为. 在不同的上下文中意味着两件事。在管道中,它表示管道中的前一个对象,但在purrr 中,它可以是进入要映射的函数的对象的简写。当包含~ 时,它只代表第二个。

    上述解决方案应该有效,但这些也应该有效。我认为您不需要包含.x = .,因为它是第一个参数,应该通过管道传递。同样,使用可重现的示例更容易检查。

    mydata %>% map(function(x) dmy(x))
    mydata %>% map(~ dmy(x))
    

    【讨论】:

    • 谢谢!那么我可以问一个跟进,我如何在sprintf 中使用. ?说map(., sprintf("I want to include the string %. here")
    • 你应该使用str_c来连接字符串,像这样:mydata %>% map(~ sprintf(str_c("I want to include the string ", ., " here")))
    • Calum,我认为 Patil 是第一个。再次感谢!!
    【解决方案2】:

    这是因为您包含. 如果您删除.,您的代码将正常工作。在这种情况下,您不必包含 ~ 并指示 purrr::map 将其视为一个函数,其参数包含在函数调用中。

    尝试以下方法:

    mydata %>% 
    purrr::map(.x = ., 
    .f = ~ lubridate::dmy(.))
    

    【讨论】:

    • 该死的!我的语法为什么会混淆map
    • 这是因为您包含了.。如果您删除 .,您的代码将正常工作。在这种情况下,您不必包含 ~ 并指示 purrr 将其视为一个函数,其自身的参数包含在函数调用本身中。希望对您有所帮助。
    • 至于您的其他问题:map(.x = ., .f = sprintf, "I want to include the string %. here" 应该可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    相关资源
    最近更新 更多