簡體   English   中英

原始值被覆蓋后如何返回函數的參數?

[英]How can I return a function's argument after the original value has been overwritten?

我知道 R 有一個簡單的方法可以做到這一點,但我無法回憶起它。 假設我有這個糟糕的代碼:

add2<-function(n)
{
  n<-n+2
  return(paste(n,"added to 2 is",n))
}

顯然,add2(4) 會返回一些愚蠢的東西,比如“6 加到 2 是 6”。 我知道 R 有一種方法可以返回這個 function 的原始參數,這會給我我的預期行為,即 Z78E6221F6393D1356681DB398F16CE6DZ “4 添加到 2”。 但它是什么? 換句話說,什么 function 應該替換我的返回值中的第一個 n?

注意:我不想要更好的方法來解決這個例子。 該示例故意過度簡化以顯示我真正追求的 function。

在您的情況下,根本不需要覆蓋n 以下代碼完全相同:

add2 <- function (n) {
  paste(n, "added to 2 is", n + 2)
}

並且 function 名稱add2具有誤導性,因為它暗示該函數的結果實際上是n + 2而不是有關該計算的某些消息。

更一般地說,您很少想要覆蓋值。 創建一個新變量來保存計算結果幾乎總是更合適的:

add2 <- function (n) {
  result <- n + 2
  message(paste(n, "added to 2 is", result))
  result
}

這將

  1. 計算結果,
  2. 打印診斷信息,
  3. 返回計算結果。

這就是你所追求的嗎?

更確切地說,以下在少數情況下有效(但不是一般情況下):

add2 <- function (n) {
    n <- n + 2
    paste(match.call()$n, "added to 2 is", n)
}

這就是失敗的原因:

add2(1 + 2)
# [1] "+ added to 2 is 5" "1 added to 2 is 5" "2 added to 2 is 5"

......這是對match.call的濫用。

根據評論中的討論, match.call是您所追求的嗎?

add2<-function(n)
{
  x <- match.call()
  n<-n+2
  print(x)
  print(names(x))
  print(x$n)
  return(paste(n,"added to 2 is",n))
}
add2(4)
add2(n = 4)
[1] ""  "n"
[1] 4
[1] "6 added to 2 is 6"

你可以試試:

add2<-function(n)
{
  n1<-n+2
  return(paste(n,"added to 2 is",n1))
}

add2(4)
[1] "4 added to 2 is 6"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM