当尝试使用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))
有效。
我在做什么错了?
答案 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)