究竟与'['做什么?

Bra*_*roy 7 string split r

我正在浏览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开始的其他语言).


42-*_*42- 6

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)

双方sapplylapply有尾随三重点的说法.因此,[作为第一个参数传递给的一系列项目只是内部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.