programing

저장된 R 객체를 새 객체 이름으로 로드할 수 있습니까?

magicmemo 2023. 7. 20. 21:51
반응형

저장된 R 객체를 새 객체 이름으로 로드할 수 있습니까?

다음을 사용하여 변수를 R 데이터 파일에 저장할 때save저장된 세션에 있는 이름으로 저장됩니다.나중에 다른 세션에서 로드할 때 로드 스크립트가 알 수 없는 동일한 이름으로 로드됩니다.이 이름은 로드 세션에서 동일한 이름의 기존 변수를 덮어쓸 수 있습니다.기존 변수를 방해할 위험 없이 데이터 파일에서 지정된 변수 이름으로 개체를 안전하게 로드하는 방법이 있습니까?

예:

세션 저장 중:

x = 5
save(x, file="x.Rda")

세션 로드 중:

x = 7
load("x.Rda")
print(x) # This will print 5. Oops.

작동 방식:

x = 7
y = load_object_from_file("x.Rda")
print(x) # should print 7
print(y) # should print 5

개체 하나만 저장하는 경우에는 사용하지 마십시오..Rdata파일, 사용.RDS파일:

x <- 5
saveRDS(x, "x.rds")
y <- readRDS("x.rds")
all.equal(x, y)

다음을 사용합니다.

loadRData <- function(fileName){
#loads an RData file, and returns it
    load(fileName)
    get(ls()[ls() != "fileName"])
}
d <- loadRData("~/blah/ricardo.RData")

새 환경을 생성하고 해당 환경에 .rda 파일을 로드한 후 해당 환경에서 개체를 검색할 수 있습니다.그러나 개체의 원래 이름이 무엇인지 알고 있거나 파일에 저장된 개체가 하나뿐이라는 몇 가지 제한이 있습니다.

이 함수는 제공된 .rda 파일에서 로드된 개체를 반환합니다.파일에 둘 이상의 개체가 있으면 임의 개체가 반환됩니다.

load_obj <- function(f)
{
    env <- new.env()
    nm <- load(f, env)[1]
    env[[nm]]
}

다음과 같은 방법을 사용할 수도 있습니다.

# Load the data, and store the name of the loaded object in x
x = load('data.Rsave')
# Get the object by its name
y = get(x)
# Remove the old object since you've stored it in y 
rm(x)

위의 다른 솔루션과 마찬가지로 변수를 환경 변수에 로드합니다.여러 변수를 로드하는 경우 이 방법으로.Rda그것들은 내 환경을 어지럽히지 않을 것입니다.

load("x.Rda", dt <- new.env())

데모:

x <- 2
y <- 1
save(x, y, file = "mydata.Rda")
rm(x, y)

x <- 123
# Load 'x' and 'y' into a new environment called 'dt'
load("mydata.Rda", dt <- new.env())
dt$x
#> [1] 2
x
#> [1] 123

개체가 하나인 Rdata 파일

assign('newname', get(load('~/oldname.Rdata')))

저장된 Rdata/RDS/Rda 파일이 아닌 일반 소스 파일로 이 작업을 수행하려는 경우 솔루션은 @Hong Oii에서 제공하는 솔루션과 매우 유사합니다.

load_obj <- function(fileName) {

  local_env = new.env()
  source(file = fileName, local = local_env)

  return(local_env[[names(local_env)[1]]])

}

my_loaded_obj = load_obj(fileName = "TestSourceFile.R")

my_loaded_obj(7)

인쇄:

"arg 값은 7"

그리고 별도의 소스 파일 TestSourceFile.R.

myTestFunction = function(arg) {
  print(paste0("Value of arg is ", arg))
}

다시 말하지만, 이 솔루션은 파일이 하나만 있는 경우에만 작동하고, 파일이 하나만 더 있는 경우에는 그 중 하나만 반환합니다(첫 번째 파일일 수도 있지만, 이는 보장되지 않습니다).

저는 @ricardo에서 답변을 확장하여 특정 변수를 선택할 수 있도록 합니다..Rdata파일에 여러 변수가 포함되어 있습니다(답변을 편집할 수 있는 크레딧이 부족합니다).변수를 나열한 후 사용자 입력을 읽을 수 있도록 몇 개의 행을 추가합니다..Rdata파일.

loadRData <- function(fileName) {
  #loads an RData file, and returns it
  load(fileName)
  print(ls())
  n <- readline(prompt="Which variable to load? \n")
  get(ls()[as.integer(n)])
}

select_var <- loadRData('Multiple_variables.Rdata')

@ricardo에 이어 별도의 환경을 (효과적으로) 사용하는 또 다른 예

load_rdata <- function(file_path) {
    res <- local({
        load(file_path)
        return(get(ls()))
    })
    return(res)
}

개체 하나만 반환될 것으로 예상되는 유사한 주의 사항

언급URL : https://stackoverflow.com/questions/5577221/can-i-load-a-saved-r-object-into-a-new-object-name

반응형