r - 将工作代码包装在函数中并停止工作
问题描述
我有一些运行良好的代码,并且在我的代码中以相同的格式重复了几次,所以我尝试将它包装在一个通用函数中,一旦我这样做,它就会停止工作。我不知道为什么,但我错过了一些基本的东西。如果你能告诉我我的基本错误,我很高兴。谢谢。Ĵ
在代码中工作的函数格式为:
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 中的任何值。它运行并且不会抛出任何错误或警告。这可能是一个“范围界定”问题吗?如果是这样,我该如何解决?
解决方案
正如索托斯所说,你错过了一个return
声明。您的函数中发生的事情是静默返回。考虑以下示例。如果我们将add
函数定义为
add <- function(x, y){
z <- x + y
}
然后打电话
add(1, 2)
似乎没有返回任何内容。没有输出打印到控制台。
另一方面,看看当我们将函数的结果分配给一个对象时会发生什么:
z <- add(1, 2)
z
[1] 3
因此,没有return
语句,该函数可以静默返回一个值。提供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
}
推荐阅读
- python-3.x - 这是将函数分配给变量吗?
- python - 使用python从日志文件中提取select语句
- html - 使用动画变换旋转地球 svg
- sql - SQL Server - Pivot 将行转换为列(带有额外的行数据)
- python - 鹡鸰片段按片段添加所有片段实体一次选择面板而不是一张一张
- mysql - 如何选择配置单元中具有不同 2 列的配置单元中的所有值
- java - 为过期和锁定的用户创建自定义消息
- mongodb - 如何使用 $exists: false 条件创建部分索引?
- javascript - 如何在打字稿中键入通用合并函数
- c# - 哪一个是 EF 中正确的一对多关系