我试图更熟悉函数编写并遇到一个问题,我现在一直试图解决3个小时。这是代码:
test <- function (x) {
for (i in x)
print(x[i])
}
当我指定一些变量时:
a <- c(0,1)
b <- c(1,2)
b工作正常,但'a'搞砸了所有:
> test(b)
[1] 1
[1] 2
> test(a)
numeric(0)
[1] 0
我认为R处理'a'中的1和0的方式有问题。但是当我在命令行迭代函数时,没有问题。
print(a[1])
[1] 0
> print(a[2])
[1] 1
R如何在函数及其外部对命令进行不同的处理?为什么1和2可以为'x',但不是0和1?
答案 0 :(得分:2)
在你的功能中,
test <- function (x) {
for (i in x)
print(x[i]) ## you are print from the indexed value
}
因此在test(a)
你正在打印:
print(a[1]) # gives the first item in the vector a
print(a[2]) # gives the second item in the vector a
test(b)
中的
print(b[0]) # gives Null, since R is 1-based
print(b[1]) # gives the first item in the vector b
因此你得到了结果
如果要通过矢量中的所有项目进行打印,可以将功能更改为
test <- function (x) {
for (i in 1:length(x))
print(x[i]) ## you are print from the indexed value
}
干杯, Biobirdman
答案 1 :(得分:1)
for循环的语法将迭代x
的值而不是x
的索引。当您致电test(c(0,1))
时,在for
循环i
的第一次迭代中,其值为0.这意味着您将尝试print
第0个元素这个论点。对于数字向量,在R中,这将始终给出numeric(0)
,一个长度为0的数字变量的R项。对R有更好,更系统的知识的人必须解释为什么这是一件好事,但是在任何情况下,它都不是我认为你想要的。
a <- c(0,1)
b <- c(1,2)
> a[0]
numeric(0)
> b[0]
numeric(0)
我认为您希望您的功能类似于
test2 <- function (x) {
for (i in 1:length(x))
print(x[i])
}
现在,我们可以将您的函数test
与test2
进行比较,并提供更多信息。
> test(c(101,202))
[1] NA
[1] NA
> test2(c(101,202))
[1] 101
[1] 202
或者我在原始问题中错过了你所追求的内容?