readLines在purrr :: map

时间:2018-12-10 16:34:56

标签: r purrr

当尝试使用map(来自purrr)执行readLines(来自基础)时,我在控制台中失去了会话*。

*没有换行,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))

有效。

我在做什么错了?

2 个答案:

答案 0 :(得分:4)

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

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

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

但这并不能终止R会话。而是告诉map(…)从指定为默认文件的文件中读取。查看该函数的文档,我们看到:

readLines

readLines(con = stdin(), n = -1L, ok = TRUE, warn = TRUE, encoding = "unknown", skipNul = FALSE) —默认情况下,con = stdin()从标准输入中读取。在交互式终端中,此操作将一直阻塞到标准输入(即交互式终端)发送“文件结束”指令为止。在大多数命令行中,您可以通过按组合键 Ctrl + D 来模拟此情况。在RStudio中,行为可能有所不同。

答案 1 :(得分:3)

这将起作用:

System.out.println( "Hello, world!".codePoints() .mapToObj(Character::isWhiteSpace) .map(Map.of(true, " ", false, "a")::get) // yeah I know, but just to be goofy .collect(Collectors.joining()));

来自`?purrr :: map

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