读取行在purrr::map中杀死R

4

当我尝试使用purrr中的map函数执行base包中的readLines时,控制台经常会丢失我的session*。

*没有出现新行,而且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))

它可以工作。

我做错了什么?


这里的波浪号是做什么用的? - Gubby
请参见 https://dev59.com/U1cP5IYBdhLWcg3wH24Z 以了解波浪符的含义。 - IceCreamToucan
2个回答

6
解决方案已发布。以下是您情况下发生的简要说明:
使用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 中,行为可能会有所不同。


非常感谢。我需要知道的是“函数”和“函数调用表达式”的区别。 - Gubby

3

这将会起作用:

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

来自 `?purrr::map`

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接