0

このような簡単な質問をするのは少し恥ずかしいことですが、私は今1時間も無駄にして、30秒の解決策を考えています。問題は、関数への入力として提供される既存のオブジェクトをどのように編集するかです。私もスーパーアサインメントで遊んだ<<-ことが成功しませんでした。

サンプル関数は2つの入力を使用します(1つはオブジェクト用、もう1つはその名前用)。'n'入力の必要性を排除するこの形式が必要です。

m <- c(2,5,3,7,1,3,9,3,5)
dim(m) <- c(3,3)
m

f <- function(x, n) { # where 'n' is the object name of 'x'
  x[1,] <- c(1,2,3)
  assign(n, x, envir = .GlobalEnv)
}

f(m, 'm')
m

前もって感謝します。

4

3 に答える 3

5

OK解決しました。ありがとう@Andrie、申し訳ありませんがあなたの返事を誤解しました。

ルーキーエラー:(

f <- function(x) {
  x[1,] <- c(1,2,3)
  return(x)
}

m <- f(m)
m
于 2012-08-27T11:22:36.997 に答える
3

追加の引数として名前を指定する必要はありません。substituteあなたのためにそれを取得します。evalで使用する呼び出し関数のスコープ内で処理を実行しますparent.frame

f <- function(x) {
  eval(substitute( x[1,] <- c(1,2,3) ), parent.frame())
}

それで、

m <- c(2,5,3,7,1,3,9,3,5)
> dim(m) <- c(3,3)
> m
     [,1] [,2] [,3]
[1,]    2    7    9
[2,]    5    1    3
[3,]    3    3    5
> f(m)
> m
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    5    1    3
[3,]    3    3    5

とは言うものの、呼び出し元の環境を変更することは一般的に悪い考えであり、値を返し、代わりに値を再割り当てすると、通常、コードの混乱や脆弱性が少なくなりますm。これは一般的に望ましいです。

f <- function (x) {
    x[1,] <- c(1,2,3)
    x
}

m <- f(m)

ただし、eval実際に配列を変更して配列のコピーを回避する必要がある場合は、シェナニガンが役立つことがあります。

于 2012-08-27T11:34:15.500 に答える
2

私はおそらくあなたがこれをしたい理由のポイントを逃していますが、これはあなたが望むことを正確に行うでしょう、私は思います:

m[1,] = c(1,2,3)

mの値は地球環境で変更されました。

ここで推測しているだけですが、オブジェクトの「名前」を取得する関数を作成している人は、Rリストが役立つ場合があることに気付くことがよくあります。名前に基づいて変数を操作したい場合は、代わりにRリストの使用を検討してください。リストのすべてのメンバーは、必要に応じて異なるデータ型を持つことができることに注意してください。

于 2012-08-27T11:38:19.443 に答える