2013-03-31 34 views
1

我有兩個功能,一個接一個的功能使用更高級別的功能

fun.a <- function (y,smth) { 
    z <- y*3 
    sapply(smth,FUN = fun.b) 
} 
fun.b <- function(x) { 
    return(x+z) 
} 

內部創建一個對象。如果我運行:

fun.a(2, c(1, 2, 3)) 

因爲z不存在我得到一個錯誤信息「低級」功能fun.b。但在fun.a中使用sapply時,我無法通過值z

也許它存在一個允許在函數內部創建一個存在於外部的對象的函數?如何解決這個問題呢?

編輯:我不想裏面複製粘貼fun.afun.b我不想用for-loop更換sapply。在這種情況下,解決方案是否仍然存在?

+0

'z'在'fun.a'的範圍內。你必須用兩個參數'x和y'來定義'fun.b'。或者在fun.a中聲明'fun.b'。 – Arun

+0

@ Arun。聲明fun.b在fun.a裏面?我該如何做這樣的事情? –

+0

@Arun Aahh你的意思是在函數fun.a中創建fun.b函數。如果我這樣做會工作嗎?因爲我不能將fun.a中的兩個元素傳遞給fun.b,因爲我想使用sapply函數 –

回答

2

這工作,你可以使用...參數傳遞任何其他值fun.b

fun.a <- function (y,smth) { 
    z <- y*3 
    sapply(smth,FUN = fun.b, z = z) 
} 
fun.b <- function(x, z) { 
    return(x+z) 
} 
fun.a(2, c(1, 2, 3)) 
0

如果你不允許修改fun.b,這是我從意見收集,屆時,fun.a體內,創建fun.b副本,並連接到它的環境:如果你確定修改的方式你的樂趣

fun.a <- function (y,smth) { 
    e <- new.env() 
    assign("z", y*3, envir = e) 
    fun.b.copy <- fun.b 
    environment(fun.b.copy) <- e 
    sapply(smth,FUN = fun.b.copy) 
} 

我還是老樣子喜歡@保羅的解決方案ctions採取他們的投入。他的回答是推薦的編程方式。

+0

我可以想象,如果你不想將你的對象複製到'fun.b',例如因爲對象非常大。但可能在大多數情況下,代碼的可讀性下降並不值得。另外,在這種情況下,不會引用類是一個好主意?比你可以傳遞引用類明顯知道函數的輸入是什麼,並且不會複製對象。 –

+1

@Paul,當你將一個對象傳遞給一個函數時,你並沒有製作它的副本。只要對象未被修改,R就會在內部使用引用。所以即使'z'很大,我仍然會推薦你的方法。在這裏,我僅僅回答了一個技術難題,假設'fun.b'不能被修改,並且不能被複制粘貼到'fun.a'的主體中。否則,我完全同意這不是一種推薦的編程風格。 – flodel

+0

有趣的是,我不知道對於沒有改變的對象,R不會複製對象,但仍然指向相同的內存位置。任何參考? –