我希望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添加这个,我该怎么做才能避免它?
非常感谢提前!
答案 0 :(得分:1)
您可以使用paste0
,然后cat
使用sep
参数。然后就不需要sapply
> a <- c("aa", "bb", "cc")
> b <- paste0("* ", a)
> cat(b, sep = "\n")
# * aa
# * bb
# * cc
cat
,str_c
和sapply
的组合是您获取结果列表的原因。 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)