Điều này không trả lời chính xác câu hỏi của bạn, nhưng tôi đã tìm thấy câu hỏi này trong khi cố gắng tìm ra một câu hỏi tương tự để tôi sẽ cho bạn thấy điều gì đó.
Giả sử bạn có một hàm mà bạn muốn áp dụng cho từng phần tử của ma trận chỉ yêu cầu một phần.
mydouble <- function(x) {
return(x+x)
}
Và nói rằng bạn có một ma trận X,
> x=c(1,-2,-3,4)
> X=matrix(x,2,2)
> X
[,1] [,2]
[1,] 1 -3
[2,] -2 4
thì bạn làm như sau:
res=mydouble(X)
Sau đó, nó sẽ làm một đôi yếu tố khôn ngoan của mỗi giá trị.
Tuy nhiên, nếu bạn thực hiện logic trong hàm như dưới đây, bạn sẽ nhận được cảnh báo rằng nó không được tham số hóa và không hoạt động như bạn mong đợi.
myabs <- function(x) {
if (x<0) {
return (-x)
} else {
return (x)
}
}
> myabs(X)
[,1] [,2]
[1,] 1 -3
[2,] -2 4
Warning message:
In if (x < 0) { :
the condition has length > 1 and only the first element will be used
Nhưng nếu bạn sử dụng hàm apply(), bạn có thể sử dụng nó.
Ví dụ:
> apply(X,c(1,2),myabs)
[,1] [,2]
[1,] 1 3
[2,] 2 4
Vì vậy, đó là rất tốt, phải không? Vâng, nó bị hỏng nếu bạn có một hàm với hai hoặc nhiều parm.Ví dụ: bạn có điều này:
mymath <- function(x,y) {
if(x<0) {
return(-x*y)
} else {
return(x*y)
}
}
Trong trường hợp này, bạn sử dụng hàm apply(). Tuy nhiên, nó sẽ mất ma trận nhưng kết quả được tính toán chính xác. Họ có thể được cải cách nếu bạn nghiêng.
> mapply(mymath,X,X)
[1] 1 -4 -9 16
> mapply(mymath,X,2)
[1] 2 4 6 8
> matrix(mapply(mymath,X,2),c(2,2))
[,1] [,2]
[1,] 2 6
[2,] 4 8
bạn có quen thuộc với họ có chức năng 'apply()' không? Tham số MARGIN chấp nhận các giá trị cho hàng, cột và hàng & cột. Chưa kể rằng một vài hàm R được vectorized và có thể tránh được loại lập trình này. – Chase
@leden bạn có thể đưa ra một ví dụ về 'f()'? Theo như tôi có thể nói, bất kỳ hàm vectơ nào cũng sẽ hoạt động trên một ma trận vì nó chỉ là một vec tơ có thuộc tính mờ. Bạn không cần phải chia nhỏ nó thành các chỉ mục hàng và cột. Tại thời điểm này có một số lượng mơ hồ trong Q của bạn; nó có vẻ như bạn muốn có một giải pháp chung nhưng hãy đăng ký rằng nó nên b dựa trên các chỉ số, đó là phụ tối ưu. –
Ý tôi là, tại sao không thể viết 'f()' như vậy mà tất cả những gì bạn thực sự cần là 'm [] <- f (m)'? Tôi sẽ thêm một ví dụ ... –