【问题标题】:Wrapping working code in a function and it stops working将工作代码包装在函数中并停止工作
【发布时间】:2020-05-22 12:18:59
【问题描述】:

我有一些运行良好的代码,我重复了它 我的代码中多次使用相同的格式,所以我尝试换行 它在一个广义函数中,一旦我这样做,它就会停止 在职的。我不知道为什么,但我错过了一些东西 基本的。如果你能告诉我我的基本错误,我很高兴。谢谢。 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 中的任何值,即使 它应该。它运行并且不会抛出任何错误或警告。这可能是一个“范围界定”问题吗?如果是这样,我该如何解决?

【问题讨论】:

  • 你需要在你的函数中返回 Vec1...return(Vec1)

标签: r function scoping


【解决方案1】:

正如 Sotos 所说,您缺少 return 声明。您的函数中发生的事情是静默返回。考虑以下示例。如果我们将add 函数定义为

add <- function(x, y){
  z <- x + y
}

然后调用

add(1, 2)

似乎没有返回任何内容。没有输出打印到控制台。

另一方面,看看当我们将函数的结果分配给一个对象时会发生什么:

z <- add(1, 2)
z

[1] 3

因此,如果没有return 语句,函数可以静默返回值。按照惯例提供某种形式的return 语句(无论是隐式还是显式)。

您的函数的一个重要警告是您需要一个返回语句。虽然您只对vec1 的子集执行替换,但如果您不使用return 语句,您的函数将仅返回满足as.logical(vec1 == va1 &amp; vec2 &gt;= val2)vec1 子集。因此,要获得您(可能)想要的输出,您应该使用

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    相关资源
    最近更新 更多