将工作代码包装在一个函数中并且它停止工作
Wrapping working code in a function and it stops working
我有一些代码工作得很好,我在
我的代码中多次使用相同的格式,所以我尝试换行
它在一个通用函数中,一旦我这样做,它就会停止
在职的。我不知道为什么,但我错过了一些东西
基本的。如果你能告诉我我的基本错误,我很高兴。谢谢。 J
代码中有效的函数格式为:
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
语句。你的函数中发生的是一个无声的return。考虑以下示例。如果我们将 add
函数定义为
add <- function(x, y){
z <- x + y
}
然后调用
add(1, 2)
似乎什么都没有 returned。没有输出打印到控制台。
另一方面,看看当我们将函数的结果赋给一个对象时会发生什么:
z <- add(1, 2)
z
[1] 3
因此,如果没有 return
语句,该函数可以 return 静默值。通常提供某种形式的 return
语句(隐式或显式)。
您的函数的一个重要警告是您需要 return 语句。虽然您仅对 vec1
的子集执行替换,但如果您不使用 return 语句,您的函数将仅 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
}
我有一些代码工作得很好,我在 我的代码中多次使用相同的格式,所以我尝试换行 它在一个通用函数中,一旦我这样做,它就会停止 在职的。我不知道为什么,但我错过了一些东西 基本的。如果你能告诉我我的基本错误,我很高兴。谢谢。 J
代码中有效的函数格式为:
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
语句。你的函数中发生的是一个无声的return。考虑以下示例。如果我们将 add
函数定义为
add <- function(x, y){
z <- x + y
}
然后调用
add(1, 2)
似乎什么都没有 returned。没有输出打印到控制台。
另一方面,看看当我们将函数的结果赋给一个对象时会发生什么:
z <- add(1, 2)
z
[1] 3
因此,如果没有 return
语句,该函数可以 return 静默值。通常提供某种形式的 return
语句(隐式或显式)。
您的函数的一个重要警告是您需要 return 语句。虽然您仅对 vec1
的子集执行替换,但如果您不使用 return 语句,您的函数将仅 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
}