我见过使用定义输入自变量的()
函式和使用定义输入自变量的其他函式[ ]
。
例如,在这里我可以使用()
以下方法定义一个函式:
my_function <- function(x1, x2, x3) {
answer = x1 x2 x3
return(answer)
}
如果我想呼叫这个函式,那么我可以这样做:
my_function(5,1,2)
[1] 8
我也可以使用[ ]
. 例如:
f_1 <- function(x) {
answer = x[[1]] x[[2]] x[[3]]
return(answer)
}
# does not work
f(5,1,2)
Error in f(5,1,2) : unused arguments (1,2)
# works:
f_1(c(5,1,2))
[1] 8
有谁知道为什么在 R 中有两种不同的定义函式的方法?其中之一对某些任务更有利吗?有什么区别吗?
谢谢!
uj5u.com热心网友回复:
括号用于原始 R 函式,如上所示。因此,(
将提供“评估论证的结果”。另一方面,方括号本质上是一个索引或“运算子作用于矢量、矩阵、阵列和串列以提取或替换部分”。
x1 <- c(1, 2, 3, 4)
x2 <- c(2, 4, 6, 8)
x3 <- c(3, 6, 9, 12)
因此,如果我们运行您的第一个函式,它将从每个索引位置添加每个串列中的元素。
my_function <- function(x1, x2, x3) {
answer = x1 x2 x3
return(answer)
}
my_function(x1, x2, x3)
# [1] 6 12 18 24
但是对于下一个函式,您必须给它一个矢量、矩阵、资料框等。因此,我们可以使用 x1 并且它将添加该串列中的所有三个元素。
f_1 <- function(x) {
answer = x[[1]] x[[2]] x[[3]]
return(answer)
}
f_1(x1)
# [1] 6
换句话说,您指的是串列中的特定值。如果我们使用f_1(x1)
,那么在函式中:
x[[1]] = 1
x[[2]] = 2
x[[3]] = 3
因此,有效的原因f_1(c(5,1,2))
是因为您给出了一个长度为 3 的矢量,它填充了函式中的所有 3 个位置。但是,如果您运行f_1(c(5,1))
,那么您将收到一条错误讯息,因为您没有足够长的矢量来执行该函式。
如果我想将一个串列中的第一个元素添加到另一个串列中的第二个元素,然后添加另一个串列中的第三个元素,那么我们可以执行以下操作:
f_2 <- function(x1, x2, x3) {
answer = x1[[1]] x2[[2]] x3[[3]]
return(answer)
}
f_2(x1, x2, x3)
# [1] 14
因此,在本例中,我们从 3 个不同的串列(即x1
、x2
、x3
)中提取 3 个数字。
x1[[1]] = 1
x2[[2]] = 4
x3[[3]] = 9
uj5u.com热心网友回复:
您的问题已经有了答案,但在这里我将从不同的角度提供一个答案。
在 R 中,物件可以包含多个值。您可以使用创建矢量
x <- c(1, 4, 9)
它包含 3 个值。您可以使用类似的语法访问这些值x[3]
(这将为您提供值 9)。你也可以使用x[[3]]
; 对于像 这样的简单矢量x
,您会得到相同的结果。
物件也可以更复杂。创建这些复杂物件的常用方法是使用list
,例如
mylist <- list(x = c(1, 4, 9), y = c(4, 5, 6))
现在mylist[[2]]
会给你矢量c(4, 5, 6)
。(您也可以使用mylist[2]
略有不同的结果,但初学者的一个好习惯是将其[[
用于串列和[
矢量。)
R 还包含函式。有像c()
andlist()
和mean()
和这样的内置函式,以及像你的my_function()
. 当我在后面用括号写它们时,这只是一个约定,表明我在谈论一个函式;实际的名称是c
,list
,mean
,和my_function
。
当您在代码中实际使用括号时,它们表示您要呼叫该函式,即将值与其每个自变量相关联,并评估其主体以执行一些计算并回传一些值。
最后,要回答您的问题,首先要说的是“我见过使用 () 定义输入自变量的函式和使用 [ ] 定义输入自变量的其他函式。” 我会描述你所看到的不同。
当函式呼叫看起来像 时my_function(5,1,2)
,您是在说您的函式有三个自变量,并且您想将这三个值 5、1 和 2 与它们相关联。
当函式呼叫看起来像这样my_function(c(5,1,2))
并且您使用x[[1]]
,x[[2]]
等参考值时,您是说您的函式有一个自变量,但它是一个包含多个值的复杂物件。
什么时候一个比另一个好?这完全取决于背景关系。如果这 3 个值始终是单个概念物件的一部分,那么将它们作为单个 R 物件的一部分是有意义的。一个例子是处理 3D 中的点:它们具有 x、y 和 z 坐标,这些都是描述点的一部分。
如果它们恰好是 3 个不相关但计算所需的东西,那么将它们放入单个物件中是没有意义的,事实上,将它们放入一个串列中只是为了以这种方式呼叫函式效率低下。
我希望这能让你对 R 有更多的了解。
0 评论