我有一些代码很好用,我的代码中多次重复相同的格式,所以我试着把它包在一个泛化的函数中,但一做,它就停止工作了。 我不知道为什么,但我漏掉了一些基本的东西。Pleased if you could show me my basic error. Thx. J
在代码中工作的函数是格式化的,所以当条件满足时,这个函数会将vec1中的值从当前值改为val3。
vec1[ as.logical (vec1 == val1 & vec2 >= val2)] <- val3
所以当条件满足时,这个函数会将vec1中的值 从当前值改为val3。 但是如果我创建一个函数,比如
ChangeState <- function (vec1, vec2, val1, val2, val3) {
vec1[as.logical(vec1 == va1 & vec2 >= val2)] <- val3
}
然后我就这样执行。
ChangeState(inputvec1, inputvec2, value1, value2, value3)
什么都没有发生,它没有改变vec1中的任何值,即使它应该改变。 它运行了,也没有抛出任何错误或警告。这会不会是 "scoping "的问题?如果是,我该如何解决?
正如Sotos所说,你缺少了一个 return
语句。 在你的函数中发生的是一个沉默的返回。考虑下面的例子。如果我们在函数中定义了 add
作为
add <- function(x, y){
z <- x + y
}
然后叫
add(1, 2)
看起来好像什么都没有返回。 没有任何输出打印到控制台。
另一方面,看看当我们将函数的结果分配给一个对象时会发生什么。
z <- add(1, 2)
z
[1] 3
所以如果没有 return
语句,函数可以默默地返回一个值。传统的做法是在函数中提供一个 return
某种形式的语句(无论是隐式还是显式)。
对于你的函数来说,一个重要的注意点是你要 需要 的返回语句。 而你只是对一个子集的 vec1
的子集,如果你不使用return语句,你的函数将只返回 vec1
符合 as.logical(vec1 == va1 & vec2 >= val2)
. 因此,为了得到你(大概)想要的输出,你应该使用
ChangeState <- function (vec1, vec2, val1, val2, val3) {
vec1[as.logical(vec1 == va1 & vec2 >= val2)] <- val3
vec1 # implicit return
}
或
ChangeState <- function (vec1, vec2, val1, val2, val3) {
vec1[as.logical(vec1 == va1 & vec2 >= val2)] <- val3
return(vec1) # explicit return
}