我正在浏览strsplitR中的一些答案.示例文本:
fileName <- c("hello.w-rp-al",
"how.nez-r",
"do.qs-sdz",
"you.d-aerd",
"do.dse-e")
Run Code Online (Sandbox Code Playgroud)
我想获得创建列表的第一个元素,并认为我可以使用诸如此类的东西
fileNameSplit <- strsplit(fileName, "[.]")
node_1 <- fileNameSplit[0]
node_2 <- fileNameSplit[1]
Run Code Online (Sandbox Code Playgroud)
但那没用.
然后我发现这个答案是建议使用sapply带[.这确实有效.
d <- data.frame(fileName)
fileNameSplit <- strsplit(d$fileName, "[.]")
d$node_1 <- sapply(fileNameSplit, "[", 1)
d$node_2 <- sapply(fileNameSplit, "[", 2)
Run Code Online (Sandbox Code Playgroud)
但是,我正在试图找出原因.到底发生了什么,以及[与任何事情有什么关系?在我看来,它在语义上令人困惑.
Fra*_*ank 12
sapply 对列表进行操作,列表是每个元素可以采用任何形式的向量.
在fileNameSplit列表的特殊情况下,我们知道列表的每个元素都是带有两个元素的字符向量.
> fileNameSplit
[[1]]
[1] "hello" "w-rp-al"
[[2]]
[1] "how" "nez-r"
[[3]]
[1] "do" "qs-sdz"
[[4]]
[1] "you" "d-aerd"
[[5]]
[1] "do" "dse-e"
Run Code Online (Sandbox Code Playgroud)
要从每个这些字符向量中提取第一个元素,我们必须迭代列表,这就是
sapply(fileNameSplit, `[`, 1)
Run Code Online (Sandbox Code Playgroud)
确实.写作时可能更清楚
sapply(fileNameSplit, function(x) x[1])
Run Code Online (Sandbox Code Playgroud)
文档说明?`[`并?sapply解释了较短版本的工作原理.
我们使用1因为这是索引从R开始的地方(不同于从0开始的其他语言).
R很像LisP.符号[实际上是一个功能.当你写的时候mylist[1],["幕后"实际发生的事情是,侧翼方括号内的编号或命名项(在这个例子中只有一个)被提取并从'mylist` 传递给函数,后者成为第一个函数参数,所以它变成:
`[`(mylist, 1) # that will also succeed if you type it at the command line
Run Code Online (Sandbox Code Playgroud)
双方sapply并lapply有尾随三重点的说法.因此,[作为第一个参数传递给的一系列项目只是内部fileNameSplit子列表中的值1,并且作为第二个参数被回收,因此您将获得每个子列表中的第一个项目.该sapply函数创建一系列调用,如:
`[`(mylist[[1]], 1) # as the first one with 2,3, ... in the [[.]] for succeeding calls
Run Code Online (Sandbox Code Playgroud)
然后将它们重新作为矩阵或列表(取决于它们是否都是相同的长度和"简化"参数的设置.)
因为您sapply没有使用"简化"arg,所以使用默认的TRUE并将值传递给simplify2array并作为vector-result返回给您,而不是您刚刚使用时返回的列表lapply.