【问题标题】:How to transform the object of a function in r?如何在r中转换函数的对象?
【发布时间】:2019-09-18 13:03:24
【问题描述】:

我想创建一个函数来转换它的对象。

我已尝试像往常一样转换变量,但在函数内。

这行得通:

vec <- c(1, 2, 3, 3)
vec <- (-1*vec)+1+max(vec, na.rm = T)
[1] 3 2 1 1

这不起作用:

vec <- c(1, 2, 3, 3)

func <- function(x){
  x <- (-1*x)+1+max(x, na.rm = T))
}

func(vec)
vec
[1] 1 2 3 3

【问题讨论】:

  • 在函数中添加return(x)后,只需将值赋回vecvec &lt;- func(vec)即可。
  • 您的“func”函数没有返回任何值。删除函数体中的“x
  • 你的向量是通过值传递给函数的,而不是通过引用
  • @MarcoPastorMayo 这是个坏主意。带有副作用的函数没有什么比这更容易或更方便了。

标签: r function transform


【解决方案1】:

R 是功能性的,因此通常会返回输出。如果你想改变 输入变量的值取输出值然后它通常由调用者完成,而不是在函数内。使用问题中的func 通常会这样做:

vec <- func(vec)

此外,虽然您可以覆盖变量,但一般来说,这并不好 主意。它使调试变得困难。是vec的当前值 输入或输出,如果是输出,输入的值是多少?我们 不知道,因为我们已经覆盖了它。

func_overwrite

也就是说,如果你真的想这样做,尽管上面有 cmets:

# works but not recommended
func_overwrite <- function(x) eval.parent(substitute({
  x <- (-1*x)+1+max(x, na.rm = TRUE)
}))


# test
v <- c(1, 2, 3, 3)
func_overwrite(v)
v
## [1] 3 2 1 1

替换函数

尽管 R 具有函数性质,但它实际上确实提供了一种用于覆盖的工具,尽管问题中的函数并不是一个很好的候选者,所以让我们更改示例以提供一个函数 incr,它将输入变量增加一个给定价值。也就是说,它会这样做:

x <- x + b

我们可以在 R 中这样写:

`incr<-` <- function(x, value) x + value

 # test
 xx <- 3
 incr(xx) <- 10
 xx
 ## [1] 13

T 与 TRUE

另一条评论。不要使用T 为真。总是写出来。 TRUE 是 R 中的保留名称,但 T 是有效的变量名称,因此可能会导致难以找到错误,例如当有人使用 T 表示温度时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 2022-01-12
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2018-09-30
    相关资源
    最近更新 更多