在R的map()中使用管道符出现异常,寻求解决方法
解决map()内使用管道符的预期结果问题
我明白你遇到的困惑了——当你用map(ls(), ~ . %>% get %>% dim)时,返回的是一个函数序列而不是每个对象的维度信息,这是因为管道符的写法在这里创建了一个未执行的函数链,而不是直接计算结果。咱们一步步拆解并解决这个问题:
为什么原来的写法会返回函数序列?
~ . %>% get %>% dim 这个匿名函数的本质是创建了一个由get()和dim()组成的functional sequence(函数序列),它本身是一个等待输入的函数,而不是直接执行计算。map会把每个ls()返回的对象名传给这个函数序列,但默认不会触发执行,所以你看到了那个提示信息。
而functions()的作用只是提取这个序列里的单个函数(比如functions(your_sequence)会返回get和dim的列表),这并不是你需要的——你要的是执行这个序列得到维度结果,而不是查看序列里的函数。
正确结合管道符与map()的写法
这里有几种简单的方法让管道表达式立即执行,得到你想要的结果:
方法1:给管道表达式加调用括号
把整个管道用括号包起来,再加上()来触发执行,把当前的.作为参数传入:
map(ls(), ~ (. %>% get %>% dim)())
方法2:给管道中的函数加括号,明确执行
在get()和dim()后加上括号,告诉R立即调用这些函数并传入.作为参数:
map(ls(), ~ . %>% get() %>% dim())
验证结果
你可以先创建几个测试对象验证:
# 创建测试对象 x <- matrix(1:4, nrow=2) y <- data.frame(a=1:3, b=4:6) # 执行任意一种正确写法 map(ls()[grep("x|y", ls())], ~ (. %>% get %>% dim)()) # 会返回:[[1]] c(2,2), [[2]] c(3,2),和预期一致
补充:你提到的非管道写法的小修正
顺便提一句,你说的map(ls(), ~ get(dim(.)))其实应该是map(ls(), ~ dim(get(.)))才对——前者是尝试获取名字等于维度值的对象,这显然不是你的需求;后者才是先获取对象,再取其维度,和管道写法的逻辑一致。
内容的提问来源于stack exchange,提问作者vuzun
相关产品推荐
相关产品推荐

