获得sapply有字符串元素

时间:2014-07-05 19:56:21

标签: regex r

我希望R以特定格式打印a中的所有元素(到给定的文本文件中)。所以这就是我的用法:

 library(stringr)
 a <- c("aa", "bb", "cc")
 b <- sapply(a, function(x) cat(str_c("* ", x, "\n")))

这基本上有效,但它增加了一些额外的东西,即:

 > b
 * aa
 * bb
 * cc
 $aa
 NULL

 $bb
 NULL

 $cc
 NULL

同样,例如typeof(b[1])是“list”,但我希望它是一个字符串。我真的不明白这里发生了什么。是什么让R添加这个,我该怎么做才能避免它?

非常感谢提前!

3 个答案:

答案 0 :(得分:1)

您可以使用paste0,然后cat使用sep参数。然后就不需要sapply

> a <- c("aa", "bb", "cc")
> b <- paste0("* ", a)
> cat(b, sep = "\n")
# * aa
# * bb
# * cc

catstr_csapply的组合是您获取结果列表的原因。 cat首先打印,这就是您的列表在开头有* aa\n* bb\n* cc的原因。

答案 1 :(得分:0)

以下是使用正则表达式的替代方法。

new  <- gsub("([[:alpha:]]{2})", "*\\1", a)
> cat(new, sep = "\n")

该表达式在一行中查找两个字母的捕获组,并将其替换为星号和空格。

然后,使用新行分隔符调用cat。

答案 2 :(得分:0)

我首先想到的是sprintf

cat(sprintf("* %s", a), sep = "\n")

然而,这个问题并不完全清楚。似乎在一个级别上,您希望能够存储此结果并在以后以这种方式使用它。在这种情况下,您可能想要考虑定义自己的print类,这不是很难做到的。

例如,这是print“myClass”对象的一个​​非常基本的class函数:

print.myClass <- function(x, ...) {
  # works on a basic vector or a list
  invisible(sapply(x, function(y) cat("* ", y, "\n")))
}

让我们看看它的作用......

首先,创建一个“a”的副本,并将其class指定为“myClass”。然后,当您在控制台上打印时,请注意会发生什么:

b <- a
class(b) <- c(class(b), "myClass")
b
# *  aa 
# *  bb 
# *  cc

它也适用于基本的list

bL <- split(a, a)
class(bL) <- c(class(bL), "myClass")
bL
# *  aa 
# *  bb 
# *  cc

而且,由于class只是attribute,您可以随时调用print.default或将输出包装在unclass中:

print.default(bL)
# $aa
# [1] "aa"
# 
# $bb
# [1] "bb"
# 
# $cc
# [1] "cc"
# 
# attr(,"class")
# [1] "list"    "myClass"

而且,正如您所料:

typeof(bL[[1]])
# [1] "character"

为了好玩,也试试......

## unclass(bL)
## unclass(b)
## print.myClass(a)