2016-11-04 100 views
0

我正在尋找一個函數,它將一個向量作爲輸入,用向量做一些簡單的算術運算,然後調用新的向量,它由一個字符串組成(比如說「log」)。 )加上原始的矢量名稱。函數中的動態變量名R

d = c(1 2, 3) 
my.function <- function { x 
x2 <- log(x) 
... 

我想回到一個名爲log.d向量函數(即不log.x什麼設置,但一些依賴於輸入向量爲x的名稱)。

+2

不要這樣做。正確的方法是'log.d < - yourfunction(d)'。像你想要的副作用是邪惡的,沒有必要。 – Roland

回答

1

你可以嘗試下一個:

d = c(1, 2, 3) 

my.function <- function(x){ 
    x2 <- log(x) 

    arg_name <- deparse(substitute(x)) # Get argument name 
    var_name <- paste("log", arg_name, sep="_") # Construct the name 
    assign(var_name, x2, env=.GlobalEnv) # Assign values to variable 
    # variable will be created in .GlobalEnv 
} 
+0

非常感謝。奇蹟般有效! – pApaAPPApapapa

+0

@pApaAPPApapapa,但要小心......'my.function(my.function(d))'不會像你所希望的那樣返回'log.log.d'。這個函數本身並沒有很好的發揮,更不用說像lapply這樣的其他函數了。 – Miff

0

這樣做的一種方法是單獨存儲所有輸入向量名稱的名稱,然後將它們傳遞給assign函數。與assign一樣,輸出對象名稱爲文本字符串,get從字符串中查找對象。

我會假設你的向量都遵循常見的模式,並從「d」開始,使它儘可能動態。

d1 <- c(1,2,3) 
d2 <- c(2,3,4) 

vec_names <- ls(pattern = "^d") 

log_vec <- function(x){ 
    log(x) 
} 

sapply(vec_names, function(x) assign(paste0("log.", x), log_vec(get(x)), envir = globalenv())) 

這應該創建兩個新對象「log.d1」和「log.d2」。