我正在DataCamp上进行一个小型R练习,问题是生成2个具有不同序列的向量,然后使用cat()和sum()获得这两个向量的所有元素的总和。
seq1 <- seq(1, 500, 3)
seq2 <- seq(1200, 900, -7)
选项1起作用:
sum(seq1)
sum(seq2)
sum(sum(seq1), sum(seq2))
选项2:
cat(seq1, seq2)
有效,但我想知道为什么以下方法不起作用:
sum(cat(seq1, seq2))
如果sum(seq1)
有效,为什么不对cat(seq1, seq2)
求和,cat()
是两个单独向量组合而成的向量?使用CREATE TABLE #temp_person
(
pid int, -- Person ID
lname varchar(255), -- Last Name
fname varchar(255) -- First Name
);
INSERT INTO #temp_person (pid, lname, fname)
VALUES (1, 'Smith', 'Bob'),
(2, 'Jones', 'Sally'),
(3, 'Edwards', 'Frank');
CREATE TABLE #temp_fruit_person
(
fid int, -- Fruit ID
name varchar(255), -- Fruit Name
pid int -- Person ID
)
INSERT INTO #temp_fruit_person (fid, name, pid)
VALUES (555, 'Orange', 1), (555, 'Orange', 2),
(666, 'Apple', 1), (666, 'Apple', 3),
(777, 'Banana', 1), (777, 'Banana', 3);
函数执行此操作的正确方法是什么?
谢谢!
答案 0 :(得分:1)
这可能是您锻炼的重点,但请注意
res <- cat(seq1, seq2)
res
将是NULL
这里的要点是,执行功能时(至少)有两个地方需要信息。控制台上显示什么,函数返回什么。当您将一个函数传递给另一个函数时,例如sum(cat(...))
,外部函数将内部函数返回的值作为输入。 cat()
返回NULL
,但是具有向控制台发送信息的副作用,因此,当您运行sum(cat(seq1, seq2))
时,将在控制台上获得序列,然后得到{ {1}}。
sum(NULL)
相比, c()
实际上返回串联的序列。通过将cat()
和seq1
传递给两者,您可以看到区别。
使用seq2
,序列被打印到控制台:
cat()
使用cat(seq1, seq2)
# 1 4 7 10 13 16 19 22 25 28 31 34 37...
返回序列。由于您尚未将其分配给任何内容,因此它仍会进入控制台,但它看起来有所不同:
c()
然后,使用c(seq1, seq2)
# [1] 1 4 7 10 13 ...
来查看总和,即可得到结果:
c()
使用sum(c(seq1, seq2))
# [1] 87029
时,控制台将被打印的顺序所取代,然后显示结果,即cat()
。
0