将工作中的代码包在一个函数中,然后它就停止工作了。

问题描述 投票:0回答:1

我有一些代码很好用,我的代码中多次重复相同的格式,所以我试着把它包在一个泛化的函数中,但一做,它就停止工作了。 我不知道为什么,但我漏掉了一些基本的东西。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 "的问题?如果是,我该如何解决?

r function scoping
1个回答
4
投票

正如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
}
© www.soinside.com 2019 - 2024. All rights reserved.