2016-11-04 28 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

これを行う1つの方法は、すべての入力ベクトル名の名前を別々に保存してから、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())) 

これは、2つの新しいオブジェクト "log.d1"と "log.d2"を作成する必要があります。