2017-04-25 31 views
2

以下兩個等價物是否定義了相同的功能?R中函數的語法?

function(df) {lm(mpg ~ wt, data=df)} 

function(df) lm(mpg ~ wt, data=df) 

特別是,我感到困惑,爲什麼就可以不寫大括號功能R.

僅需用於當定義一個函數花括號函數定義擴展到多行?

(也許一些關於如何R和Python的技術上支持從C分號,但它被認爲是不好的做法,使用它們?)

這似乎解釋也許就是爲什麼人們通常不使用大括號定義時匿名函數,因爲匿名函數通常很短,因此可以放在一行中,所以大括號不是必需的。

但有可能傳遞匿名函數的定義超過一行(顯然這可能是不好的做法,但這不是我的觀點)?

如果可能,是否需要大括號?

+0

@jogo你是對的,謝謝你指點一下out - 在編輯中修復 – Chill2Macht

+2

關於「是否有可能」,您可以嘗試一下。例如,'y = {x = 1; x + 2}'的作品,你可以通過實驗來弄清楚。正如jogo所說,花括號包裝了一個表達式,並且恰好在函數中很有用。 – Frank

+0

@jogo,請張貼的答案... –

回答

9

你的例子不是關於匿名函數。它大約是{},如果它們之間只有一個表達式,則不需要它們。
- 表達式可能比一行更長。
- 在一行中可以有多個表達式(用分號分隔)。
- 匿名函數不限於一行。

您可以找到文檔{像往常一樣:help('{')

例子:

x <- 3; y <- 4; z <- x + y # more than one expression on a line 

z <- x + 
y + 
2 # the expression x+y+2 extends over three lines 

x <- matrix(1:30,3) 
apply(x, 1, function(x) sd(x)/ 
median(x)) # anonymous function definition on two lines 

有時候一個人要小心代碼換行符。在某些情況下,他們被解釋者認爲是句法單位的結尾。在這種情況下「小心」的意思是:
給翻譯一個理由在下一行搜索
這是行不通的:

x <- 11:15 
x 
[3] # because of the linebreak it is not x[3] 

但是,這將做到:

x[ 
3 
] 
# the interpreter was searching for the ']' (till it was found) 

這是我吸取了教訓的情況:

if (...) { ... } 
else { ... }  # unexpected 'else' !!! 

從那時起我這樣編碼:

if (...) { 
    ... 
} else { 
    ... 
} 

請參閱Unexpected 'else' in "else" error

A 非匿名函數(即,命名函數)比通過分配與對象名連接的功能定義沒有別的:以備後用

fname <- function(...) ... 

。你甚至可以做到這一點的地方,通常是一個匿名函數,可以發現:

x <- matrix(1:30,3) 
apply(x, 1, FUN=(mysuperfunc <- function(x) sd(x)/median(x))) 

但這是更好的可讀性是一樣的:

mysuperfunc <- function(x) sd(x)/median(x) 
x <- matrix(1:30,3) 
apply(x, 1, FUN=mysuperfunc) 
+3

你或許應該指出的是,文檔可供{。 – Roland