2015-05-11 13 views
7

Tôi đang cố gắng viết một hàm trong R có hai đầu vào là chuỗi. Nếu không có đầu vào nào được đặt, nó sẽ yêu cầu đầu vào và sau đó tiếp tục chức năng.R chức năng; nếu đầu vào không được đưa ra, hãy yêu cầu nó

Input < - function(j,k){ 
    if ((j==j)&&(k==k)){ 
     j <- readline(prompt="Enter Input 1: ") 
     k <- readline(prompt="Enter Input 2: ") 
     Input(j,k) 
    }else if ((j=="<string here>")&&(k=="<string here>")){ 
     .... 
    } 
} 
+0

Bạn có thể làm rõ ý nghĩa của cụm từ "không được nhập" không? Hầu hết các câu trả lời giả định điều này có nghĩa là nếu một trong hai không được thiết lập, do đó, có "hoặc" logic trong dòng đầu tiên, nhưng bạn có "và" logic. Dường như nhiều khả năng bạn muốn kiểm tra chúng một cách riêng biệt; có nghĩa là, nếu 'j' bị thiếu, hãy yêu cầu' j' và nếu 'k' bị thiếu, hãy yêu cầu' k'. Cảm ơn. – Aaron

Trả lời

3

Tôi nghĩ rằng cách tốt hơn để cấu trúc cách tiếp cận của bạn sẽ được này, sử dụng đối số tùy chọn và thử nghiệm để xem nếu họ không null trước khi tiếp tục, mặc dù phải thừa nhận là câu hỏi được đăng của bạn là rất mơ hồ:

Input < - function(j=NA, k=NA) { 
    if (is.na(j) | is.na(k)){ 
    j <- readline(prompt="Enter Input 1: ") 
    k <- readline(prompt="Enter Input 2: ") 
    Input(j, k) 
    } else if ((j == "<string here>") & (k == "<string here>")) { 
    .... 
    } 
} 
+1

Tôi nghĩ rằng 'NULL' được ưu tiên cho các đối số hàm tùy chọn - xem ví dụ: 'plot.default' - sau đó bạn có thể kiểm tra bằng cách sử dụng' is.null' – thelatemail

+0

Tôi không chắc chắn lý do tại sao nó sẽ được ưa thích trong trường hợp này? Tốt nhất nó sẽ tương đương nhưng không liên quan? Trong thực tế, khi tôi nhìn lại nó, giá trị mặc định ưa thích có thể là một chuỗi rỗng nếu bạn muốn hàm hỏi lại các giá trị đầu vào nếu người dùng không gõ bất cứ điều gì tại một hoặc cả hai lời nhắc. –

+1

Nó có thể không tạo sự khác biệt trong tất cả các trường hợp, nhưng nó có thể gây ra các vấn đề tùy thuộc vào kỳ vọng, ví dụ: 'NULL' là không có gì, không có độ dài, trong khi' NA' là chiều dài == 1, vector lớp logic. Họ không thực sự tương đương, nhưng đó là một vấn đề nhỏ ở đây. Không tìm cách bắt đầu bất kỳ tranh cãi lớn nào. – thelatemail

3

Mặc dù cá nhân tôi thích is.NA hoặc is.NULL (như trong @Forrest 's câu trả lời), đây là một sự thay thế với missing rằng có thể trông đơn giản hơn cho người bắt đầu ngay bây giờ với R.

Input <- function(j, k) { 
    if (missing(j) | missing(k)){ 
    j <- readline(prompt="Enter Input 1: ") 
    k <- readline(prompt="Enter Input 2: ") 
    Input(j, k) 
    } else if ((j == "<string here>") & (k == "<string here>")) { 
    .... 
    } 
} 
+0

Trong trường hợp này, bạn không thể thực sự gọi hàm Input() mà không cung cấp một số giá trị cho các đối số 'j' và' k'. Họ không bao giờ có thể bị mất vì bạn đã chỉ định chúng làm đối số không bắt buộc. –

+0

Chức năng này hoạt động đối với tôi (phiên bản R 3.2.0). Tôi không nghĩ R thực sự yêu cầu các đối số tồn tại trong các hàm trừ khi chúng được sử dụng theo một cách nào đó. Hãy thử 'u <-function (x) print (1); u()'. –

+0

Vâng, đó là hành vi nổi tiếng và tốt trên phần R. Nhưng điều này sẽ không hoạt động: 'u <-function (x) {x == x; in (1)}; u()' và hàm như nó được viết ở trên sẽ không chạy trừ khi 'j' và' k' được thông qua vì chúng không được cung cấp mặc định và được sử dụng bên trong khai báo hàm. –

3

Tôi nghĩ rằng có lẽ đơn giản nhất là đặt mã readline làm đối số. Các force lệnh đánh giá lực lượng của mã đó tại điểm đó trong hàm. Tôi không nghĩ rằng chúng là cần thiết nhưng tùy thuộc vào chức năng khác, bạn có thể muốn đảm bảo rằng nó yêu cầu jk trước thay vì sau này; nếu không mã sẽ được đánh giá khi nó đầu tiên cần biết những gì jk là.

Input <- function(j = readline(prompt="Enter Input 1: "), 
        k = readline(prompt="Enter Input 2: ")) { 
    force(j) 
    force(k) 
    if ((j=="<string here>") && (k=="<string here>")) { 
     .... 
    } 
} 
+0

Tôi thích giải pháp này vì nó loại bỏ rõ ràng nếu/sau đó kiểm tra trên j/k. Tôi nghĩ rằng 'force()' là một trong những chức năng mà bạn không bao giờ biết hoặc cần trừ khi bạn đang chiến đấu với một số khó khăn để theo dõi lỗi phạm vi, nhưng chắc chắn tốt đẹp để minh họa ở đây. –

Các vấn đề liên quan