簡體   English   中英

R:將符號向量傳遞給函數而不是長參數列表

[英]R: pass a vector of symbols into a function instead of a long argument list

我正在編寫一個使用.C()函數調用C代碼的R包。 我需要將50多個參數傳遞給.C(),這會嚴重影響我的代碼並容易出錯。 而不是打字

output <- .C("my_dynlib", arg2, arg3, arg4, arg5, arg6, ..., arg53)

我寧願有一個字符向量myNames的附加參數發送到.C()並做類似的事情

f <- Vectorize(as.symbol, "x")
mySymbols <- f(myNames)
output <- .C("my_dynlib", mySymbols)

但這不是我想要的,因為mySymbols是一個列表。 有沒有辦法將一組參數緊湊地傳遞給我不想重寫的函數?

腳注:我猜你們中的一些人會建議用.Call,.External或Rcpp傳遞更復雜的參數,但這比我現在要處理的更徹底。


編輯:如果我希望myNames指向s3或s4對象中的插槽,該怎么辦?

假設我想使用引用數據幀中類槽的符號。

> y = data.frame(a = 1:4, b = 5:8)
> myNames = paste("y@", slotNames(y), sep = "")
> mySymbols = lapply(myNames, as.symbol)
> str(mySymbols)
List of 4
 $ : symbol y@.Data
 $ : symbol y@names
 $ : symbol y@row.names
 $ : symbol y@.S3Class

我像@josilber一樣使用do.call,但do.call不識別符號

> do.call(print, mySymbols)
Error in (function (x, ...)  : object 'y@.Data' not found

即使我可以手動使用這些符號。

> y@.Data
[[1]]
[1] 1 2 3 4

[[2]]
[1] 5 6 7 8 

如果您有要傳遞給函數的對象列表,則可以使用do.call函數執行此操作。 在您的情況下,聽起來像下面應該工作:

do.call(".C", c("my_dynlib", mySymbols))

暫無
暫無

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

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