2D data.frame
또는 matrix
을 1D 벡터로 자동 변환하면 일반 함수를 작성하는 데 약간의 문제가 발생합니다. foo[,1:3]
같은 명령을 입력 foo
의 일부 열을 필터링하려고 예를 들어, data.frame
또는 matrix
을 위해 잘 작동 :입력이 벡터 일 때 작동하는 테이블에 대한 일반 함수 작성
foo=matrix(1:9,nrow=3)
bar = function(x) print(x[,1])
bar(foo) # [1] 1 2 3
그러나 우리가 처음 foo
의 일부 행을 필터링 할 생각, 그것은 단지 하나의 것을 발생 행은 남아있다 :
bar(foo[1,]) # Error in x[, 1] : incorrect number of dimensions
:
bar = function(x) {
if (is.null(dim(x))) x = t(data.frame(x))
print(x[,1])
}
bar()
의 본문에있는 x
에 다른 필터가 있으면이 필터를 다시 벡터로 변환하면 문제가 훨씬 더 복잡해집니다. 그런 다음 모든 필터링에 대해 우리가 가지고있는 것을 여전히 확인하기 위해 점검하고 수행해야합니다.
다른 문제는 행렬의 필터링 된 부분이 단일 행/열인 경우 행 이름 및/또는 열 이름 누락입니다. 필터링 된 부분을 행렬로 재구성하고 원래 행/열 이름을 검색하여 결과 행렬에 할당하려면 추가 조작이 필요합니다.
질문은 : 간단하게 테이블에 대해 작동하는 함수를 변환합니다. 입력이 벡터 인 경우에도 여전히 작동합니까?
이것이'drop' 인수가있는 것이라고 생각합니다. – joran
대신에'stopifnot (is.data.frame (x) || is.matrix (x))'를 추가하여 행렬 및/또는 data.frames에서만 작동하는 함수를 작성하는 것을 고려하십시오. 'bar (foo [1,])'을 실행했다면 의미있는 메시지로 에러가 나올 것이고, @joran처럼 bar (foo [1,, drop = FALSE])를 사용해야한다는 것을 알 것입니다. 제안했다. – flodel