【问题标题】:readLines killing R in purrr::mapreadLines 在 purrr::map 中杀死 R
【发布时间】:2019-05-11 14:25:40
【问题描述】:

尝试使用 map(来自 purrr)执行 readLines(来自 base)时,我一直在控制台中丢失会话*。

*不要换行,R 似乎没有运行任何东西

如果我输入一个文件路径向量:

paths <- c("a/file.csv", "a/nother_file.csv")

并尝试使用 map 和 readLines 将所有顶部行删除,R 死了。

result <- map(paths, readLines(n = 1))

但如果我这样做:

result <- map(1:2, function(x) readLines(paths[x], n = 1))

它有效。

我做错了什么?

【问题讨论】:

标签: r purrr


【解决方案1】:

解决方案已发布。以下是您的情况的简要说明:

要使用purrr::map,您应该向它传递一个函数。但是readLines(n = 1) 不是函数,它是一个函数调用表达式。这是非常不同的:再举一个例子,sum 是一个函数sum(1 : 10) 是一个函数调用表达式,它的计算结果为整数值 55。但sum 本身,计算结果为……它本身:一个可以调用的函数(你不能调用sum(1 : 10):它只是一个整数)。

当您编写readLine(n = 1) 时,该函数会在map 被调用时立即被调用——而不是purrr 在数据上,而是按原样调用。如果您直接调用 readLines(n = 1) 而不将其包装在 map(…) 中,也会发生同样的情况。

但这并没有杀死 R 会话。相反,它告诉readLines 从指定为其默认值的文件中读取。查看函数的文档,我们看到:

readLines(con = stdin(), n = -1L, ok = TRUE, warn = TRUE,
          encoding = "unknown", skipNul = FALSE)

con = stdin() — 默认情况下,readLines 从标准输入读取。在交互式终端中,这会阻塞,直到标准输入(即交互式终端)发送“文件结束”指令。在大多数命令行上,您可以通过按下组合键 Ctrl+D 来模拟这一点。在 RStudio 内部,行为可能会有所不同。

【讨论】:

  • 非常感谢。 functionfunction call expression 之间的区别是我需要知道的。
【解决方案2】:

这将起作用:

result &lt;- map(paths, readLines, n = 1)

来自`?purrr::map

Usage
map(.x, .f, ...)
... Additional arguments passed on to .f.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多